简单C扫描不起作用?

简单C扫描不起作用?,c,console,scanf,C,Console,Scanf,如果我尝试以下方法: int anint; char achar; printf("\nEnter any integer:"); scanf("%d", &anint); printf("\nEnter any character:"); scanf("%c", &achar); printf("\nHello\n"); printf("\nThe integer entered is %d\n", anint); printf("\nThe char entered is

如果我尝试以下方法:

int anint;
char achar;

printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);

它允许输入一个整数,然后完全跳过第二个
scanf
,这真的很奇怪,因为当我交换这两个时(先交换
char
scanf),它工作正常。到底有什么错呢?

它没有跳过第二个
scanf()
;第二个
scanf()
读取第一个
scanf()
留下的换行符。大多数格式代码跳过空白;
%c
格式不会跳过空白。

使用
scanf
读取输入时,按下返回键后读取输入,但返回键生成的换行符不会被
scanf
使用,这意味着下次从标准输入读取
char
时,将有一个换行符可供读取

一种避免的方法是使用
fgets
将输入读取为字符串,然后使用
sscanf
提取所需内容:

char line[MAX];

printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 ) 
   anint=0;

printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 ) 
   achar=0;
另一种使用换行符的方法是
scanf(“%c%*c”,&anint)
%*c
将从缓冲区读取换行符并丢弃它

您可能需要阅读以下内容:


其他答案正确-
%c
不跳过空格。最简单的方法是将空格放在
%c
之前:

scanf(" %c", &achar);
(格式字符串中的任何空格都将使
scanf
使用所有连续的空格)。

在每次printf调用后也尝试使用\u flushall()。基本上,默认情况下,MS的C++缓冲区流输出,而FLASH导致输出流空。<> P>调用<代码> GETCHARE()/<代码>之前,代码> SCANF也将清除存储的断线。更轻量级但更具情境性

char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);

将刷新换行符,这在连续的代码行中更有用,因为您知道它只是一个排队的值而不是字符串

您的指针大小不正确,anint是char,achar是int。不要这样做。@Variable Length Coder:很抱歉,我们解释了一个简单的示例,并将其与这两个示例混合在一起。该错误键入与我的问题无关,修复了该示例。您需要在
%d
格式之后使用
%*c
,不是吗?即使这样也不可靠——如果用户在数字之后和换行符之前键入空格或其他内容。我认为
fgets()
+
sscanf()
更好。@乔纳森:你说得对。在
%d
之后,我们需要它。是的,
fgets+sscanf
总是更好。@codeaddict:很抱歉接受了这么长的时间,但你确实让我对C语言的内部工作有了更多的了解。我也非常感谢C FAQ链接,最好是明智地教给新手这些东西,如果我以后能帮助别人的话。跳过空格对丢弃新行有什么帮助?例如:
scanf(“\n%c”和&achar)
也可以。@cpx:因为换行符是空白。格式字符串中的任何空格的行为都与任何其他空格类似,因此
\n
与空格一样好(但多了一个字母)。