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
之前的空格可以占用任意数量的换行符。