scanf的问题

#include  int main() { char C, B; int x; printf("What comes after G\n"); scanf("%c", &C); printf("What comes after O\n"); scanf("%c", &B); printf("What is your age?\n"); scanf("%d", &x); printf("You said %c comes after G, %c after T and you're %d years old? Right?", C, B, x); return 0; } 

问题在于,无论何时运行代码,它都会跳过第二个问题“O之后发生了什么”,然后问“你的年龄是多少?”

可以避免程序跳过第二个问题的唯一方法是在代码中添加一个空格

 printf("What comes after O\n"); scanf(" %c", &B); 

你可以看到%c之间的空格

你能解释一下吗?

您需要占用空白区域(即换行) – 根据手册页http://linux.die.net/man/3/scanf

问题是你正在使用scanf来获取字符..并且将在用户的每个输入的末尾添加一个新行。 所以第二次只有新行存储在’B’中因为你给出的第一个输入..

而不是scanf,将其更改为getchar – 您的问题应该得到解决

您可以使用scanf来吃掉单个字符而不将其分配给这样的任何内容::

 scanf( "%[^\n]%*c", &C ) ; 

%[^\n]告诉scanf读取每个不是'\n'字符。 这会在输入缓冲区中留下'\n'字符,然后* (assignment suppression)将消耗单个字符('\n')但不会将其分配给任何内容。

出现此问题的原因是按Enter键后前一个scanf行字符\n剩余。 这个\n留给下一次scanf调用。
要避免此问题,您需要在scanf %c说明符前放置一个空格。

 scanf(" %c", &C); ... scanf(" %c", &B); ... scanf(" %c", &X); 

%c之前的空格可以占用任意数量的换行符。