繁体   English   中英

如何验证我是否从标准输入(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个整数并检查它是否创建了魔方。 但是,我不知道如何从stdin做到这一点。

输入应采用以下格式: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?

我已经编写了一个程序来检查给定的矩阵是否形成了魔方,所以问题是关于从stdin接收信息。 请提供代码,以便我可以理解和学习。

非常感谢您的帮助。

先获得第一个号码

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 != '\0' || 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM