gpt4 book ai didi

c - scanf ("%d",a) 使用 "while"语法绕过 scanf

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:45 26 4
gpt4 key购买 nike

如果没有初始化 ("mod=0") ,这段代码进入死循环。我不明白为什么这段代码会循环,即使我使用了 getchar();删除缓冲区。当我先输入“1”,然后再输入“a”时,就会出现无限循环。谁能帮助我了解这种情况?

int main()
{
srand((unsigned)time(NULL));
int mod = 0;
int val = 0;
do {
printf("\t-----------------------------\n");
printf("\t|%5s %5s %5s %5s|\n", "1.create", "2.modify", "3.print", "4.quit");
printf("\t|%15s","Input command : ");
scanf("%d", &mod);
printf("\t-----------------------------\n");
switch (mod){
case 1: random(); val++; break;
case 2: if(val != 0) { modify(); break; }
case 3: if(val != 0) { print(); break; }
default: getchar(); printf("\tUnknown Command!! Retry!! \n"); break;
}
} while (mod != 4);
}

我使用 Visual Studio 2015 编译了这段代码。

最佳答案

当您输入 a 时,它是 mod 的无效输入,因为 scanf() 需要一个 int %d。所以它读入 mod。所以 mod 保留了在上一次迭代中输入的 mod 的值。

它进入无限循环的原因是因为 scanf() 没有丢弃无效输入。因此反复尝试读取 a 并失败并继续循环。

检查 scanf() 的返回值并丢弃任何无效输入。scanf() 是出了名的不利于读取用户输入,正确处理输入失败通常更难使用它。

更好的方法是使用 fgets() 读取 输入然后使用 sscanf() 解析它.

do {
...

printf("\t|%15s","Input command : ");

fgets(line, sizeof line, stdin);
char *p = strchr(line, '\n');
if(p) *p = 0; /* remove tailing newline, if present */
if( sscanf(line, "%d", &mod) != 1) {
printf("Invalid input\n");
continue;
}

printf("\t-----------------------------\n");
....

}while (mod != 4);

关于c - scanf ("%d",a) 使用 "while"语法绕过 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34560317/

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