【问题标题】:getchar not working properly after using scanf in C在 C 中使用 scanf 后 getchar 无法正常工作
【发布时间】:2021-06-13 04:53:22
【问题描述】:

我正在写这段代码:

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 语句并退出代码。

有人知道为什么吗?

【问题讨论】:

  • 检查来自scanf的返回值并从那里开始
  • getchar 返回一个int。如果 c 不是 int 类型,则您无法可靠地检查 EOF。
  • 如果您的输入文件是文本,则极有可能c &gt;= 9 为真。也许您的意思是if( c &gt;= '9' || c &lt; '0'),它与if( c &gt;= 9 || c &lt; 0) 非常不同
  • 你提供了什么输入?您是否在不同的行上提供了 scanfgetchar 的输入?如果是这样,getchar 将读取scanf 留下的未读换行符。 Just avoid using scanf.
  • while (scanf("%d", &amp;b) != 1) { fputs ("error: invalid integer input.\n", stderr); for (int c = getchar(); c != '\n' &amp;&amp; c != EOF; c = getchar()) {} }

标签: c scanf getchar


【解决方案1】:

发现问题并解决问题

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

  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.

【讨论】:

  • 正确的想法:使用int c,错误的原因:“注意EOF不是一个有效的字符!它扩展为-1”--1是一个有效的签名值 charint 需要区分 256 个 unsgined char 值和 EOF
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2021-09-23
相关资源
最近更新 更多