C : while( scanf("%d",&num) != 1 ) 无限循环

Posted

技术标签:

【中文标题】C : while( scanf("%d",&num) != 1 ) 无限循环【英文标题】:C : while( scanf("%d",&num) != 1 ) infinite loop 【发布时间】:2022-01-22 04:34:33 【问题描述】:

希望你能帮我解决这个问题 我必须使用scanf 来读取和验证输入... 我试过这段代码:

int num = 0;
while( scanf("%d",&num) != 1 || num < 3 || num > 9)
printf("Enter new num: ");

当我输入数字时效果很好,但是当我输入任何其他字符时它进入无限循环而不是要求新输入...

Enter new num: Enter new num: Enter new num: Enter new num:
Enter new num: Enter new num: Enter new num: Enter new num:
Enter new num: Enter new num: Enter new num: Enter new num:

有什么想法吗?

谢谢

【问题讨论】:

你刚刚学会了一个从不使用scanf()的好理由——当你输入意外的输入时,它就会卡住。 @AndrewHenle 正如我所提到的......不幸的是我必须使用它...... 另一种方法是在使用fgets 读取的字符串上使用sscanf 如果a在输入流中,scanf会看到a但不会读取它(因为它不能被解析为int的一部分)并且不写入就返回0 num 的值。由于条件为真,它会重复该过程并且永远不会消耗a。您需要丢弃无效数据。 不好意思问了,你是故意写不可读的代码吗?这是一个严肃的问题。 【参考方案1】:

您需要从输入缓冲区中删除无效数据。例如

int num = 0;
while( scanf("%d",&num) != 1 || num < 3 || num > 9)
    scanf( "%*[^\n]%*c" );
    printf("Enter new num: ");

这是一个演示程序。

#include <stdio.h>

int main( void )

    int num = 0;

    printf("Enter new num: ");
    
    while( scanf("%d",&num) != 1 || num < 3 || num > 9)
        scanf( "%*[^\n]%*c" );
        printf("Enter new num: ");
    
    
    printf("num = %d\n", num );

程序输出可能看起来像

Enter new num: 1
Enter new num: A
Enter new num: 10
Enter new num: 5
num = 5

【讨论】:

这几乎可以工作,但它不能处理EOF @WilliamPursell 他将继续循环,直到输入有效数字。 如果输入流关闭,则永远不会输入有效数字。在这种情况下,终止程序是正确的行为。但更重要的是,您需要让初学者意识到这个问题并展示如何处理它。 @WilliamPursell 不,对于初学者来说,你写的内容完全不重要。他需要的是获得一个允许忽略非数字的有限循环。 @BenEz 完全没有。不客气。我还建议关注 William Pursell 的 cmets。

以上是关于C : while( scanf("%d",&num) != 1 ) 无限循环的主要内容,如果未能解决你的问题,请参考以下文章

C语言while(scanf("%d",&num)==1);语句的一个问题

c语言 scanf("%d",&a);输入字符为啥会进入死循环?

c语言请问while循环为啥执行不了?

while(~scanf("%d", &n)) 和 while(scanf("%d", &n), n) 有啥不同

C语言中静态局部变量的问题

关于while (~scanf("%d %d", &m, &n))的用法