首页 > 解决方案 > 在 C 中使用 scanf 后 getchar 无法正常工作

问题描述

我正在写这段代码:

int b;
char c;

scanf("%d", &b);

while((c = getchar()) != EOF) {
    if(c >= 9 || c < 0) {
        printf("Invalid number!\n");
        exit(0);
    }
}

当我分配b时,自动c等于b。例如,如果我的输入为bis 10,它会自动进入if- 语句并退出代码。

有谁知道为什么?

标签: cscanfgetchar

解决方案


发现问题并解决它们

下面列出的代码中有很多错误。

  1. getchar(3)说:

    getchar()相当于getc(stdin)

    的原型getc()是:

    int getc(FILE *stream);
    

    也就是说,getchar()返回一个整数(来自unsigned char强制转换)。因此,我们需要将类型从更改为char正确int接受它的返回值。

    请注意,这EOF不是有效的unsigned char. 它扩展到signed int-1。

  2. 永远不要忽略scanf(3). 它返回正确传递的参数的数量。在这种情况下,为了使代码可靠,我们应该输入:

    if (scanf("%d", &b) != 1) {
      fprintf(stderr, "Value must be an integer.\n");
      return EXIT_FAILURE;
    }
    
  3. 条件中存在语义错误:

    if (c >= 9 || c < 0)
          ^^____________ logically, 9 is a valid one digit number
                         so removing '=' from here makes more sense
    

    一件值得注意的事情是比较器的条件和类型——两者都应该改变。请参阅下一步。

  4. 固定循环应如下所示:

    while ((c = getchar()) != EOF) {
      if (c == '\n') // Since c = getchar() can be '\n' too
        continue;    // so, better ignore
    
      if (c >= '0' && c <= '9') // Change the loop like this
        printf("Valid number %d %c.\n", c, c);
      else
        printf("Invalid number.\n");
    }
    

示例测试用例输出

1 
10    // --- Note: 10 are two chars for two getchars
Valid number 49 1.
Valid number 48 0.
3
Valid number 51 3.
9
Valid number 57 9.
- 
Invalid number.
a
Invalid number.
<
Invalid number.
.
Invalid number.

推荐阅读