我在C上读到一个字符时出错了

时间:2017-10-01 05:09:42

标签: c

我想从控制台读取一个字符,但是当我这样做时,程序会读取字符,我必须编写另一个字符来保存第一个字符并完成执行。

代码:

#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;
}

任何人都可以解释为什么会这样做以及如何纠正这个错误?

1 个答案:

答案 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?

Behaviour of scanf when newline is in the format string