【问题标题】:char in buffer preventing input of integer缓冲区中的字符阻止输入整数
【发布时间】:2017-10-31 19:48:57
【问题描述】:
#include <stdio.h>

int main(void) {
    int n,m=5;
    char c;
    while(m>0)
    {
        m--;
        scanf("%d",&n);
        if(n==42)
        break;
        printf("%d",n);
        fflush(stdin);
        scanf("%c",&c);
        puts(&c);       
    }
    return 0;
}

虽然我知道当第一次输入数字scanf 后按下回车键时,第二个scanf 会将它(回车)作为输入,但我的疑问是,当我给5ttttt 时输入,输出为

5t
5t
5t
5t
5t

由于输入缓冲区中没有整数,为什么不要求输入整数| 第二个问题是,即使我们遵循上述行为,然后在输入 5t 然后按 enter 应该将两个字符作为缓冲区('t' 和 'enter')但只有 t 被带入缓冲区,输出为

5t

但我期待输出

5t
5

因为 'enter' 将被放入缓冲区,它不会在循环的第二次迭代中要求整数输入。

【问题讨论】:

  • 您在哪个平台上工作?如果您在 Windows 上,您将获得与在类 Unix 系统上不同的行为。有关详细信息,请参阅Using fflush(stdin)。每次使用时都应该检查scanf()的返回值。
  • @JonathanLeffler 我在 Mac 上工作,我也在 ideone.com 上检查了我的输入
  • 如果您使用的是 Mac,那么 fflush(stdin) 充其量是无操作的。读完5后,scanf("%c", &amp;c);读到t;下一个scanf("%d", &amp;n); 失败(但您忽略了这一点)而不更改n,并且scanf("%c", &amp;c); 读取t。这会持续 5 次迭代,然后循环因计数 (m) 降至 0 而终止。如果您输入 5tuvwx,您会得到更好的启发。
  • @JonathanLeffler 这正是我要问的,为什么下一个 scanf("%d",&amp;n); 失败,我尝试输入 5tuvwx。

标签: c string input char scanf


【解决方案1】:

首先,看这个关于fflush(stdin); being undefined behaviour的帖子,干脆别干了。

你可以滚动你自己的函数去完成这个。类似的东西

  while ((c = getchar()) != '\n' && c != EOF) { }

应该很好地完成这项工作。

也就是说,

   puts(&c);  

也会导致undefined behavior,因为&amp;c 不指向字符串。变量c 的类型为char,它不是char 数组,它需要被视为字符串 强制空终止。因此,由于内存溢出,您实际上是在访问导致 UB 的超出范围的内存。

您可能想改用putchar()

【讨论】:

  • @sauravghosh ` while ((c = getchar()) != '\n' && c != EOF) { }` 将此行放在我的代码中的什么位置。
  • @ayush A) 将c 定义为int B) 使用而不是fflush(stdin);
【解决方案2】:

避免使用fflush(stdin)。您可以使用getchar() 而不是fflush(stdin)。 在scanf("%d", &amp;n) 输入一个整数后,你会按回车,对吗? \n(换行符)将被getchar() 使用,您可以安全地使用scanf("%c", &amp;c) 输入的字符。否则\n 将被c 占用。

【讨论】:

  • 不是我的反对意见,但我建议您说明如何使用getchar() 进行清理。请注意,OP 键入 5ttttt 作为第一行输入 - 您也需要正确处理。
  • @Jonathan Laffler 谢谢。
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多