为什么这个代码会保留打印行10和14,如果有人意外地给scanf写了一个字母而不是一个整数?

时间:2014-10-25 11:43:13

标签: c scanf continue

本代码执行它应该做的事情,只要你真的输入一个整数,因为它在第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 }

1 个答案:

答案 0 :(得分:0)

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

我建议您使用例如fgets阅读输入,然后使用sscanf对其进行解析。