我如何验证我从标准输入 (Stdin) 得到了 N^2 个整数?
how can i verify that i got N^2 integers from standard input(Stdin)?
我在使用 C 语言提交的项目时遇到问题。我被要求编写一个程序来获取 N 和 N^2 整数并检查它们是否创建了一个幻方。
但是,我错过了输入应该来自 stdin,而且我不知道该怎么做,因为我使用 printf 请求用户提供 N 并扫描它,然后要求用户输入输入 N^2 个整数并检查它是否创建幻方。但是,我不知道如何从标准输入中做到这一点。
输入的格式应为:sizeofN,N1,N2,...,N^2。例如:3 8 1 6 3 5 7 4 9 2 - 表示 3 是 N,其他元素是它后面的内容。
所以我的问题是:
1)如何以上述方式从标准输入(stdin)获取值?它是来自 while ((c=getchar()) != EOF) 之类的东西,还是有更聪明的方法?
2)如何检查我是否真的得到了 N^2 项? (第一个数字是 N,我应该在它之后得到 N^2 个输入,例如,如果我得到:3 8 1 3 4 5 9 8 5 这意味着 N 应该是 3,我应该得到 9 个整数,但我只得到8,我如何编写一个函数来检查我是否真的得到 N^2 个数字正在得到 N?
我已经编写了一个程序来检查给定矩阵是否形成幻方,所以问题是关于从标准输入接收信息。请提供代码,以便我理解和学习。
非常感谢您的帮助。
先取第一个数
if( scanf("%d",&N) != 1){
fprintf(stderr,"Error in input");
exit(1);
}
现在你验证它是否确实是一个好数字。
if( N <= 0 ){
fprintf(stderr,"Enter integral N >= 1");
exit(1);
}
现在循环,
for(size_t i = 0; i < N*N; i++){
if( scanf("%d",&a[i]) != 1){
fprintf(stderr,"Enter integral N >= 1");
exit(1);
}
}
在这个 scanf()
的解决方案中,您得到了 N^2
个数字,因为在每次迭代中您都正确输入了一个整数。
使用getchar()
不是一个好的选择。因为 size>=4
的每个幻方至少有 2 位数字。您不能直接使用 getchar()
获取它们,除非您相应地处理它们并从中提取整数,这是您使用 getchar()
的一种选择,但不必要地使事情复杂化。
此外,如果您想验证所需的数字是否比输入的数字多,或者对输入进行更精细的控制,那么您可以使用 fgets()
并立即读取一行并将其解析为int
.
如果将这些作为参数提供给程序,那么您可以使用 argc
和 argv
轻松完成验证部分。假设你想检查输入的数字是否正确。
所以你检查一下,
int main(){
char *ptr;
int N;
errno = 0;
if( argc > 2){
long NN = strtol(argv[1], &ptr, 10);
if (errno != 0 || *p != '[=13=]' || NN > INT_MAX || NN < INT_MAX) {
fprintf(stderr, "%s\n", "Error in parsing");
exit(1);
}
else{
N = (int)NN;
}
}
int totalElmts = N*N;
if( N && totalElmts / N != N){
fprintf(stderr, "%s\n","Overflow");
}
if( argc != (totalElmts + 2) ){
fprintf(stderr, "%s %s %s\n",argv[0],"N","NxN elements");
}
for(size_t i = 2; argv[i] != NULL; i++)
{
//convert argv[i] to `int`
}
...
return 0;
}
我在使用 C 语言提交的项目时遇到问题。我被要求编写一个程序来获取 N 和 N^2 整数并检查它们是否创建了一个幻方。
但是,我错过了输入应该来自 stdin,而且我不知道该怎么做,因为我使用 printf 请求用户提供 N 并扫描它,然后要求用户输入输入 N^2 个整数并检查它是否创建幻方。但是,我不知道如何从标准输入中做到这一点。
输入的格式应为:sizeofN,N1,N2,...,N^2。例如:3 8 1 6 3 5 7 4 9 2 - 表示 3 是 N,其他元素是它后面的内容。
所以我的问题是:
1)如何以上述方式从标准输入(stdin)获取值?它是来自 while ((c=getchar()) != EOF) 之类的东西,还是有更聪明的方法?
2)如何检查我是否真的得到了 N^2 项? (第一个数字是 N,我应该在它之后得到 N^2 个输入,例如,如果我得到:3 8 1 3 4 5 9 8 5 这意味着 N 应该是 3,我应该得到 9 个整数,但我只得到8,我如何编写一个函数来检查我是否真的得到 N^2 个数字正在得到 N?
我已经编写了一个程序来检查给定矩阵是否形成幻方,所以问题是关于从标准输入接收信息。请提供代码,以便我理解和学习。
非常感谢您的帮助。
先取第一个数
if( scanf("%d",&N) != 1){
fprintf(stderr,"Error in input");
exit(1);
}
现在你验证它是否确实是一个好数字。
if( N <= 0 ){
fprintf(stderr,"Enter integral N >= 1");
exit(1);
}
现在循环,
for(size_t i = 0; i < N*N; i++){
if( scanf("%d",&a[i]) != 1){
fprintf(stderr,"Enter integral N >= 1");
exit(1);
}
}
在这个 scanf()
的解决方案中,您得到了 N^2
个数字,因为在每次迭代中您都正确输入了一个整数。
使用getchar()
不是一个好的选择。因为 size>=4
的每个幻方至少有 2 位数字。您不能直接使用 getchar()
获取它们,除非您相应地处理它们并从中提取整数,这是您使用 getchar()
的一种选择,但不必要地使事情复杂化。
此外,如果您想验证所需的数字是否比输入的数字多,或者对输入进行更精细的控制,那么您可以使用 fgets()
并立即读取一行并将其解析为int
.
如果将这些作为参数提供给程序,那么您可以使用 argc
和 argv
轻松完成验证部分。假设你想检查输入的数字是否正确。
所以你检查一下,
int main(){
char *ptr;
int N;
errno = 0;
if( argc > 2){
long NN = strtol(argv[1], &ptr, 10);
if (errno != 0 || *p != '[=13=]' || NN > INT_MAX || NN < INT_MAX) {
fprintf(stderr, "%s\n", "Error in parsing");
exit(1);
}
else{
N = (int)NN;
}
}
int totalElmts = N*N;
if( N && totalElmts / N != N){
fprintf(stderr, "%s\n","Overflow");
}
if( argc != (totalElmts + 2) ){
fprintf(stderr, "%s %s %s\n",argv[0],"N","NxN elements");
}
for(size_t i = 2; argv[i] != NULL; i++)
{
//convert argv[i] to `int`
}
...
return 0;
}