为什么会自动跳过此C scanf?

我在C中遇到有关scanf问题。请不要将此问题标记为重复,因为我在这里搜索了很多这个问题并发现了许多相似的问题,但他们并没有完全回答我。

当我运行这个:

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

然后前两个scanf正常工作,但第三个完全跳过。 我在这个论坛中搜索了关于这个问题的不同post,发现了很多信息,但想知道其他的东西。

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

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

另一个解决方案可能是使用:

 getchar(); 

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

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

如果要使用"%c"格式跳过前导空格,则需要使用格式字符串中的空格明确告诉scanf ,例如" %c"

这与“在int之后无法获取char ”相同的问题,只有一点点扭曲。

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

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

现在问题变得清晰了:第三个scanf尝试读取一个int ,但缓冲区是x ,所以无法读取。