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

时间:2016-06-15 12:46:32

标签: c

我在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,这就是为什么跳过第3个字符的原因。但是为了进一步研究,我发现当我在第二个scanf之后使用另一个char scanf类型时,它会起作用。这意味着,在我的情况下,如果我在integer类型之后输入任何char类型,则会出现问题。我再次看到许多其他人遇到了相反情况的问题,他们在char之后无法输入integer。现在,我希望澄清C scanf支持的确切方案,即我将面临类似问题以及为什么char可以在char之后进行扫描但integer不能。谢谢大家。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

问题与" char"之后的int无法解决。

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

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

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