c语言 scanf("%d",&a);输入字符为啥会进入死循环?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 scanf("%d",&a);输入字符为啥会进入死循环?相关的知识,希望对你有一定的参考价值。
scanf("%d",&a);这语句只从输入缓冲区接收数字,输入字符时就不会接收,输入的字符永远在缓冲区内。
a没有接收值所以a的值为初值0。
所以a
!=
b为真,进入while循环。
而while里面的scanf("%d",&a);语句一样会从缓冲区接收数字,但缓冲区还是前面输入的字符,所以还是接收不到。
所以a
!=
b恒成立。
所以就会死循环。 参考技术A 研究过scanf函数是怎样接收整型数字的吗?它要跳过所有非数字的字符专接收数字。那么输入了字符它就一直留在输入缓冲区;只要缓冲区有字符,scanf就要去读,一读不是数字,它就跳过,试图等到输入缓冲区没有字符了才等待你输入……如此反复,当然就“死循环”了。为了验证,你在printf("you
lose!!\n");后加一句getchar();,把缓冲区里的那个非数字字符接收掉,看看还会不会是“死循环”? 参考技术B 你这个问题可以利用scanf函数的返回值来解决,scanf函数的返回值是个整数,它的含义是输入和格式匹配的参数的个数,比如scanf("%d"%d",&a,&b);
如果输入
2
3,那就会返回2,输入2
a,返回1输入a
3
则返回0,一旦碰到格式不匹配的输入,就把不匹配的输入留在缓冲区并且拒绝读取,那么你这个例子的scanf("%d",&a);如果格式正确匹配的话会返回1,那就利用这一点来判断是否出现了不匹配的情况:
int b=2,a=0;
scanf("%d",&a);
while(a != b)
printf("you lose!!\n");
if(scanf("%d",&a)!=1) //如果不匹配
while(getchar()!='\n'); //清空输入缓冲,可能有字符串输入,所以用了循环
参考技术C 1.
scanf("%d",&a);
应当键入数字,如果键入字母,scanf
语句执行失败,a当中未取得输入值,scanf函数返回0。
2.
不一定是死循环,根程功编制的能有关。
有些情况,是由于输入流里的你键入的字母没有被清掉,后面的输入语句连续执行失败。可以用
fflush(stdin);
清除多余的字符。
例程:
#include<stdio.h>
int main()
int n=9;
scanf("%d",&n);
printf("%d\n",n);
fflush(stdin); // 清除
scanf("%d",&n);
printf("%d\n",n);
fflush(stdin); // 清除
scanf("%d",&n);
printf("%d\n",n);
return 0;
参考技术D 这个理论上是不会进入死循环的,
因为你只要输入的数字是2,
它就会跳出循环.
但是问题是,
你的这个程序没有清空输入缓冲区的功能,
这样一旦第一次输入留下了一个\n,
那后面的scanf就无法输入了.
C : while( scanf("%d",&num) != 1 ) 无限循环
【中文标题】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语言 scanf("%d",&a);输入字符为啥会进入死循环?的主要内容,如果未能解决你的问题,请参考以下文章
C语言while(scanf("%d",&num)==1);语句的一个问题