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语言的scanf实现一次输入若干个数据

c语言中多个scanf怎么输入

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

C语言中输入函数等待输入和结束输入

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

c语言 退出函数 写法