【问题标题】:Why this C scanf is automatically skipped? [duplicate]为什么这个 C scanf 会被自动跳过? [复制]
【发布时间】:2016-06-15 12:46:31
【问题描述】:

我在 C 中遇到了关于 scanf 的问题。当我运行这个时:

char c;
int a, b;

scanf("%d", &a);
scanf("%c", &c);
scanf("%d", &b);

然后前两个scanf 工作正常,但第三个被完全跳过。我在这个论坛上搜索了关于这个问题的不同帖子,发现了很多信息,但想知道别的。

我已经发现最简单的解决方案是:

scanf("%d %c %d", &a, &c, &b);

另一种解决方案可能是:

getchar();

我还发现我的问题背后的原因是它向缓冲区写入了一个额外的换行符\n,这就是跳过第三个的原因。但是为了进一步研究,我发现当我在第二个 scanf 之后使用另一个 char 类型的 scanf 时,它就可以工作了。这意味着,在我的情况下,如果我在char 类型之后输入任何integer 类型,就会出现问题。我再次看到许多其他人遇到相反情况的问题,他们无法在integer 之后输入char。现在我想澄清一下 C 中支持 scanf 的确切方案,那是我将面临类似问题的时候,以及为什么 char 可以在 char 之后扫描但 integer 不能。谢谢大家。

【问题讨论】:

  • 我不认为你说的那样有问题.....其他人遇到的另一个问题是实际问题。
  • scanf 永远不会被跳过。要找出你的 scanf 的结果是什么,请检查它的返回值。
  • 要获得有关特定代码的帮助,请发布MCVE 并准确说明您输入的内容。

标签: c


【解决方案1】:

"%d" 格式说明符包括跳过前导空格。 "%c" 格式没有这个,它读取输入缓冲区中的下一个字符,无论它是什么类型的字符。

如果您想使用"%c" 格式跳过前导空格,您需要明确告诉scanf 在格式字符串中使用空格来执行此操作,例如" %c".

【讨论】:

    【解决方案2】:

    这与“在int 之后无法使用char”是相同的问题,只是稍有不同。

    回想一下,当您使用 scanf%d 格式说明符从输入中读取 int 时,代表数字的字符会被消耗,但它后面的分隔符不会。考虑一个看起来像这样的缓冲区(我使用下划线表示空格):

    char     9 8 _ x _ 7 6
             - - - - - - -
    position 0 1 2 3 4 5 6
    
    • 在第一次调用scanf 之前,您的缓冲区定位为零。
    • 第一次调用后,您的缓冲区位于 2。
    • 在第二次调用后,您的缓冲区位于 3,因为已为您的 char 读取空间

    现在问题变得清晰了:第三个scanf 尝试读取int,但缓冲区位于x,因此无法读取。

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 2021-11-07
      • 2017-08-12
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2018-09-17
      • 2013-01-07
      相关资源
      最近更新 更多