在 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。 例如,如果我对 b 的输入是 10,它会自动进入 if 语句并退出代码。

有人知道为什么吗?

解决方法

发现问题并解决问题

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

  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.

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...