我如何验证我从标准输入 (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.


如果将这些作为参数提供给程序,那么您可以使用 argcargv 轻松完成验证部分。假设你想检查输入的数字是否正确。

所以你检查一下,

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;
}