C:简单的复制输入(getchar)到输出(printf)返回额外的行

时间:2014-02-21 23:54:27

标签: c printf getchar

我在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

4 个答案:

答案 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()