我想从控制台读取一个字符,但是当我这样做时,程序会读取字符,我必须编写另一个字符来保存第一个字符并完成执行。
代码:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
char peps;
int main(int argc, char const *argv[]) {
printf("write a character:\n");
scanf(" %c\n", &peps);
printf("%c\n", peps);
return 0;
}
任何人都可以解释为什么会这样做以及如何纠正这个错误?
答案 0 :(得分:1)
如果您从\n
删除了scanf()
,它应该可以正常工作。
即,
scanf(" %c", &peps);
而不是
scanf(" %c\n", &peps);
这是因为\n
格式字符串中的scanf()
告诉计算机在读取字符后读取并忽略所有空格(包括\n
)。
因此,所有包含通过输入回车键给出的换行符的空格都将被忽略。仅当遇到无法读取的非空格字符时才会停止,因此将保留在输入缓冲区中。
因此,在您的情况下,首先会读取一个字符,并在printf()
之后执行scanf()
之前等待非空格字符。非空白字符将保留在输入缓冲区中并且未被读取,因此不会立即打印。只有在再次阅读stdin
时才能阅读。
如果您想进一步探讨此问题,请考虑将scanf()
和printf()
置于循环中并检查输出。
请注意,将\n
替换为空格会产生相同的效果。
即,
scanf(" %c\n", &peps);
和
scanf(" %c ", &peps);
会有相同的行为。
What's the behavior of scanf when the format string ends with a newline?