c - 为什么通过scanf()输入一个非预期的值类型会导致这个程序进入死循环

标签 c types buffer scanf

考虑以下代码片段:

int n;
int a[100];
int main()
{
    printf("\nThis program will sort a given list of between 1 and 100 integers.\n\n");
    int ready = 0;
    while(!ready)
    {

        printf("How many integers are in your list? ");
        scanf("%d",&n);

        if(n>100)
        {
            printf("\n\nError:\tToo many integers.\n\tThis program can only handle up to 100 integers.\n\n\n"); 
        }
        else if (n<1)
        {
            printf("\n\nError:\tNot enough integers.\n\tThis program requires at least 1 integer to sort.\n\n\n");
        }
        else ready=1;
    }
}

如果您在提示符处输入任何整数,它会按预期工作,但是如果您输入一个字符,它会开始不断输出:

How many integers are in your list?

Error: Too many integers.
       This program can only handle up to 100 integers.

...
...
recurse over and over

显然它与 scanf() 函数有关,但我想知道导致此抽象以其方式泄漏的幕后原因。

我已经习惯了有漂浮物和救生衣的语言,我正在努力适应和 C 在游泳池更深的一端游泳。

最佳答案

如果您输入一个字符,则 scanf() 会失败,之后不会定义结果,而且输入不会被消耗并保留在缓冲区中递归地获取相同的值,从而导致您的 scanf()反复失败。

所以你应该这样做

if(scanf("%d",&n) == 1)
// Do your stuff

关于c - 为什么通过scanf()输入一个非预期的值类型会导致这个程序进入死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28368267/

相关文章:

c - "Program received signal SIGSEGV , Segmentation fault” 尝试使用递归获取所有3字符组合的关键字时

c - 在 C 中返回二维数组

jquery输入数字

types - 解释器和静态类型检查

node.js - Node js 's Buffer.toString( ' 二进制')

java - BufferedReader java未到达文件末尾

c - SSE Intrinsics 算术错误

c - 如何从 Conan 配方中的要求中获取正确的值用作 CMake 参数?

c - 如何使用for循环打印输入的字符串?

c# - 检索由 BlockCopy 压缩的数组