在 C 语言中使用 scanf 的多个条件

Multiple conditions with scanf in C

提问人:Grolldash 提问时间:11/20/2022 最后编辑:Andreas WenzelGrolldash 更新时间:11/20/2022 访问量:59

问:

TLDR:在使用 EOF 时,我需要检查我使用 scanf 扫描到数组中的输入是否真的是整数。

我需要将数字扫描到数组中,直到 EOF。我使用静态分配的内存做所有事情,因为我是一个初学者,现在动态分配的内存对我来说很难理解。我也使用 getc 在末尾获取“\n”输入(但这不是问题 - 只是这样说,所以你知道)。我的第一个想法是:

while(scanf("%d", &number[i][j]) != EOF )
**some code**

但此解决方案不会检查输入是否为整数。例如,如果我的输入是。

1 2 3
4 0 5
2 3 a

代码不会停止,因为最后一个数组的值是 0,直到我扫描一个数字进入其中。我的解决方案是

while(1)
    if(scanf("%d", &number[i][j]) != 1)
        printf("Incorrect input.\n");
return 0;

但由于 EOF 等于 -1,这意味着我甚至在我不想要的文件末尾也得到了输入。那么有没有办法让更多的条件比较扫描呢?例如(我知道这行不通,但为了帮助您理解我的意思):

while(1)
    if(scanf("%d", &number[i,j] != 1 && scanf("%d", &number[i,j]) != EOF)
        printf("Incorrect input.\n");
return 0;

但是这个“解决方案”需要两次输入。我还在这个网站上找到了一些答案,建议使用其他方式代替 scanf,但我需要专门使用 scanf 函数。

数组 C 输入 scanf eof

评论

1赞 William Pursell 11/20/2022
通常的方法是 .然后,您可以使用它来确定是否存在输入错误或 EOF。或者你可以做while( 1 == scanf(...))feofwhile( (c = scanf(...)) == 1){...} if( c == 0) { /* report bad input and abort */ } else { /* hurrah, EOF without input error */}
0赞 hyde 11/20/2022
即使只有 1 条语句,也请使用。请缩进您的代码。请提供一个最小的可重现示例,您已经检查过,即使打开了警告,也不会给出任何编译器警告。比如,应该给你一个关于代码的警告,但没有效果。{}number[i,j]
0赞 hyde 11/20/2022
作为一般准则,要轻松处理输入错误,请读取整行,然后解析该行,如果存在解析错误,请请求新行。这是因为输入本质上是基于行的,您的程序始终等待用户输入,直到用户在整行之后按回车键。
0赞 Grolldash 11/20/2022
我完全忘记了您可以将 scanf 的值分配给整数以检查多个条件。谢谢大家的帮助。现在结束问题。

答:

1赞 Andreas Wenzel 11/20/2022 #1

您可以将返回值保存到类型的变量中,然后稍后对其执行进一步的测试:scanfint

int val, ret;

while ( ( ret = scanf( "%d", &val ) ) != EOF )
{
    if ( ret != 1 )
    {
        printf( "Incorrect input.\n" );
        exit( EXIT_FAILURE );
    }

    //input is ok, so do something with the input value
    DoSomethingWithValue( val );
}

//if this line of code is reached, then EOF has been encountered