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);输入字符为啥会进入死循环?