为什么会自动跳过此C扫描?

为什么会自动跳过此C扫描?,c,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); 另一个解决方案是: g

我在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
之后使用另一个
scanf
字符
类型时,它就起作用了。这意味着,在我的例子中,如果在
char
类型之后输入任何
integer
类型,就会出现问题。我再次看到许多其他人的问题正好相反,他们不能在
integer
之后输入
char
。现在,我想澄清一下C中支持的
scanf
的确切方案,也就是说,我将面临类似的问题,以及为什么
char
可以在
char
之后扫描
integer
不能。感谢大家。

格式说明符包括跳过前导空格。
“%c”
格式没有这个功能,它读取输入缓冲区中的下一个字符,不管它是什么类型的字符


如果要使用
%c
格式跳过前导空格,则需要明确告诉
scanf
使用格式字符串中的空格,例如
%c
,这与“不能在
int
之后使用
char
是同一个问题,只需稍加改动即可

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

  • 在第一次
    scanf
    调用之前,缓冲区位于零
  • 第一次调用后,缓冲区位于2
  • 第二次调用后,缓冲区位于3,因为为
    char

现在问题清楚了:第三个
scanf
尝试读取
int
,但缓冲区位于
x
,因此无法读取;I don’我不认为你说话的方式有问题。。。。。其他人遇到的另一个问题是实际问题。永远不会跳过scanf。要了解scanf的结果是什么,请检查其返回值。要获得有关特定代码段的帮助,请发布一个,并准确指定键入的输入。
char     9 8 _ x _ 7 6
         - - - - - - -
position 0 1 2 3 4 5 6