【问题标题】:Repeat the last line of the input using EOF(CTRL+D)使用 EOF(CTRL+D) 重复输入的最后一行
【发布时间】:2018-02-26 19:17:35
【问题描述】:

当我输入输入值并键入 ctrl + d 时,最后一行重复,这不应该发生。有人知道发生了什么吗?

  while(1) {
        if(getchar()==EOF)
            break;
        scanf(" %c %d", &s, &b)

  }

例如,我输入 (input)m 2 的图像,如果我单击 ctrl+d 完成程序,结果是 5(output),然后再次打印 5,我不希望这样。

【问题讨论】:

  • 打开调试器并单步执行代码以查看实际发生的情况。提示:scanf 将字符留在输入缓冲区中。
  • scanf("%c %d",&s,&b);%c 之前可能需要一个空格,但在%d 之前有一个不必要的空格。大多数scanf 格式说明符,包括%d 会过滤掉前导空格,但%c 不会,除非前面有空格。我建议scanf(" %c%d", &s, &b); 注意每个逗号后面的额外空格——这是编码风格的问题。

标签: c scanf eof


【解决方案1】:

scanf("%c %d",&s,&b); 在您输入后停在换行符处,但不会将其从输入流中删除。所以下一次对getchar() 的调用会返回那个换行符,而不是返回EOF

然后你再次调用scanf(),但不要检查结果。它没有任何内容可供读取,因此它使变量sb 保持不变,然后您再次打印。

然后你回到循环的顶部。现在getchar() 返回EOF

将循环条件更改为:

while (scanf(" %c %d", &s, &b))

并摆脱 getchar() 检查。

%c 之前的空格将使它跳过字符之前的任何空格。

【讨论】:

    【解决方案2】:

    永远不要假设scanf 成功了。检查它的返回值以确保它能够读取您期望的所有内容。

    int n = scanf("%c %d",&s,&b);
    if ( n != 2 )
    {
       // deal with the error.
    }
    else
    {
       // Use the data
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      相关资源
      最近更新 更多