在while循环中使用scanf()检查输入类型

时间:2015-03-08 19:08:10

标签: c scanf

我一直在编写一个程序,它接受输入并检查数字是偶数还是奇数,如果输入的字符不是我的初始代码的数字,则输出错误信息:

int main()
{
    int x;
    int check = scanf("%d", &x);
    printf("input: ");
    while(check != 1){ //means that the input is inappropriate 
       printf("Error!: unexpected input\n"); 
       printf("input: ");
       check = scanf("%d", &x);
    }
    if(x%2 == 0){
    printf("It's even\n");
    }else{
    printf("It's odd\n");
    }
return 0;
}

当我运行无限循环打印时“错误!:意外输入\ n” 但是当我在while循环中放入以下语句时它的工作正常,语句是:scanf("%s",&x); 有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:0)

int check = scanf("%d", &x);不消耗“输入是字符而不是数字”,将该输入留在stdin中以用于下一个输入函数。由于下一个输入函数是check = scanf("%d", &x);,因此它不会消耗有问题的数据,因此循环重复。

代码需要使用scanf("%d", ...)以外的其他内容读取“输入是字符而不是数字”


建议不要使用scanf(),而不是搞乱一点。阅读fgets()getline()的输入,然后使用ssscanf()strtol()等进行解析。

int main(void)     {
    int x;
    char buf[100];
    while (printf("input: "), fgets(buf, sizeof buf, stdin) != NULL) {
      int check = sscanf(buf, "%d", &x);
      if (check == 1) break;
      printf("Error!: unexpected input\n"); 
    }
    if(x%2 == 0){
      printf("It's even\n");
    }else{
      printf("It's odd\n");
    }
  return 0;
}