gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:20:06 25 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
}

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

Here是对 scanf 的很好的概述。

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

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