我在C中测试一个简单的程序:
int main() {
int c;
c = getchar();
while ( c != EOF ) {
printf("%c\n", c);
c = getchar();
}
}
然而,当我提供像“a”,“b”这样的简单输入时,它会打印出“a \ n \ n,b \ n \ n”......有人可以解释一下吗?谢谢!
☛ gcc hello.c; ./a.out
a
a
b
b
c
c
答案 0 :(得分:3)
因为它获得了EOL角色以及你输入的角色。
您的输入不是'a','b',它是'a \ nb \ nc \ n',并且您的脚本配置为(基本上)在每个字符后输出一个新行。
所以第一次通过循环,它得到'a'并打印'a \ n',然后它得到'\ n'并打印'\ n \ n'。然后是'b'和'b \ n'等等。
尝试使用此尺寸:
int main() {
int size = 500;
char buff[size];
char* check;
int read;
check = fgets(buff, sizeof(buff), stdin);
while ( check != NULL ) {
printf("%s", buff);
check = fgets(buff, sizeof(buff), stdin);
}
}
答案 1 :(得分:1)
查看代码
printf("%c\n", c);
这表示要打印出角色,然后打印换行符。这是为了回显具有字符和换行符的输入。
您可能希望关闭字符回显以进行交互式使用。或者只是从文件中读取输入。
答案 2 :(得分:1)
输入一个字符并按回车键后,'\ n'换行符字符仍留在输入流中,然后用第二个getchar();
取出它所以你的printf打印出一个换行符,然后打印另一个,因为它拾取了换行符。
答案 3 :(得分:1)
getchar()
从输入缓冲区中获取一个字符。默认情况下,输入模式是行缓冲(“规范”模式),这意味着您输入“a”后按Enter / Return键,并且只有在将数据放入输入缓冲区之后,才会导致两个字符添加到输入缓冲区:“a”char本身和“\ n”字符对应于Enter / Return键。
如果需要,不同的操作系统有不同的切换到无缓冲(“非规范”)模式的方法。这是UNIX / Linux系统上的一些ioctl()
或tcsetattr()
魔法,以及Windows上的SetConsoleMode()
。