gpt4 book ai didi

c - 如果有人不小心给 scanf 一个字母而不是整数,为什么这段代码会继续打印第 10 行和第 14 行?

转载 作者:行者123 更新时间:2023-11-30 17:27:00 24 4
gpt4 key购买 nike

只要您真正键入一个整数(如第 10 行所要求的那样),此代码就会执行其应该执行的操作,但如果您键入的字母不是整数,它只会打印出第 10 行和14 一遍又一遍,我真的不明白为什么,它不应该在再次执行之前检查 while 循环的条件吗?

1  #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 int raten(int zuErraten){
6 int geraten = 0, check = 1, versuche = 0;
7 while (versuche < 100 || geraten != zuErraten) {
8 versuche++;
9 printf("%i\n", versuche);
10 printf("Gib eine Zahl zwischen 1 und 100 ein:\n");
11 check = scanf("%i", &geraten);
12
13 if (check == 0) {
14 printf("Gib lediglich eine Zahl ein und drücke Enter:\n");
15 check = 1;
16 geraten = 0;
17 continue;
18 }
19
20 if (geraten < 1 || geraten > 100){
21 printf("Die Zahl sollte wirklich zwischen 1 und 100 sein, wobei 1 und 100 auch erlaubt sind!\n");
22 continue;
23 }
24
25 if (geraten < zuErraten) {
26 printf("Du hast %i geraten, diese Zahl ist leider zu klein!\n", geraten);
27 }
28
29 if (geraten > zuErraten) {
30 printf("Du hast %i geraten, diese Zahl ist leider zu groß!\n", geraten);
31 }
32
33 }
34
35 return versuche;
36 }
37
38 int main (int argc, char **argv){
39 time_t t;
40 srand((unsigned) time(&t));
41 int zuErraten, geraten, versuche;
42
43 zuErraten = (rand()%100) + 1;
44 printf("%i\n", zuErraten);
45 versuche = raten(zuErraten);
46 printf("Herrzlichen Glückwunsch, du hast die Zahl erraten.\nDu hast dafür %i Versuche gebraucht!\n", versuche);
47 }

最佳答案

因为scanf如果输入缓冲区中的内容与格式不匹配,则不会删除它。因此,下一次迭代它将再次读取完全相同的输入,然后失败。一次又一次……

我建议您使用例如fgets读取输入,然后使用 sscanf 解析它。

关于c - 如果有人不小心给 scanf 一个字母而不是整数,为什么这段代码会继续打印第 10 行和第 14 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26561973/

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