gpt4 book ai didi

c - 为什么 scanf() 在此代码中导致无限循环?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:40 26 4
gpt4 key购买 nike

我有一个小的 C 程序,它只从标准输入读取数字,每个循环周期读取一个数字。如果用户输入了一些 NaN,则应该向控制台打印一个错误,并且应该再次返回输入提示。输入“0”时,循环应该结束,给定的正/负值的数量应该打印到控制台。这是程序:

#include <stdio.h>

int main()
{
int number, p = 0, n = 0;

while (1) {
printf("-> ");
if (scanf("%d", &number) == 0) {
printf("Err...\n");
continue;
}

if (number > 0) p++;
else if (number < 0) n++;
else break; /* 0 given */
}

printf("Read %d positive and %d negative numbers\n", p, n);
return 0;
}

我的问题是,在输入一些非数字(如“a”)时,这会导致无限循环一遍又一遍地写入“-> Err ...”。我想这是一个 scanf() 问题,我知道这个函数可以用更安全的函数代替,但这个例子是为初学者准备的,只了解 printf/scanf、if-else 和循环。

我已经阅读了问题 scanf() skips every other while loop in C 的答案并浏览了其他问题,但没有真正回答这个具体问题。

最佳答案

scanf 仅消耗与格式字符串匹配的输入,返回消耗的字符数。任何与格式字符串不匹配的字符都会导致它停止扫描并将无效字符留在缓冲区中。正如其他人所说,在继续之前,您仍然需要从缓冲区中清除无效字符。这是一个非常肮脏的修复,但它会从输出中删除有问题的字符。

char c = '0';
if (scanf("%d", &number) == 0) {
printf("Err. . .\n");
do {
c = getchar();
}
while (!isdigit(c));
ungetc(c, stdin);
//consume non-numeric chars from buffer
}

编辑:修复了一次性删除所有非数字字符的代码。不再为每个非数字字符打印出多个“错误”。

Here是对 scanf 的一个很好的概述。

关于c - 为什么 scanf() 在此代码中导致无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41393720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com