我在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
不能。谢谢大家。
答案 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
调用之前,缓冲区位于零。char
现在问题变得清晰了:第三个scanf
尝试读取int
,但缓冲区位于x
,因此无法读取。