繁体   English   中英

为什么getchar()表现不同?

[英]Why getchar() behaves differently?

我发现getchar()在某些情况下表现不同。
在下面的代码中,它吞噬了输入中的换行符。

#include <stdio.h>

// copy input to output; 1st version
int main()
{
    int c;

    while((c = getchar()) != EOF) 
    {
        putchar(c);
    }
}

终端的输入和输出如下所示。

j
j
b
b
asdf
asdf
ashdfn
ashdfn

它完全复制输入并忽略输入中的换行符,因为在每次输入后按下了返回键。

但是,如果循环中有printf()语句,它不再忽略换行符。

#include <stdio.h>

// copy input to output; 1st version
int main()
{
    int c;

    while((c = getchar()) != EOF)
    {
        putchar(c);
        printf("\n");
    }
}

终端的输入和输出如下所示。

j
j


b
b


asdf
a
s
d
f


ashdfn
a
s
h
d
f
n

它回应了换行符,在之前的情况下曾经被忽略过。

你能告诉我为什么会有区别,它的表现如何?

在第一种情况下,它读取一个字符 - getchar()并打印它 - putchar() ,因此在每个字符后面没有换行符或'\\n' 换行符是您输入按键时输入的换行符。

在第二种情况下,你有printf("\\n")在打印每个字符后打印新行 - 通过putchar()

getchar读取一个字符。 当您输入123并按Enter键时,此输入将转到C标准缓冲区,再加上一个字符\\n (按Enter键生成)。 现在从那里getchar读取一个字符,输入流中的其余字符留下来为下一次调用getchar
现在,为了回答你的问题,我将用一个简单的程序解释它;

#include <stdio.h>

int main(void)
{
     int c, b;

     c = getchar();
     putchar(c);

     b = getchar();
     putchar(b);

     b = getchar();
     putchar(b);
 }  

给输入123 ,缓冲器的输入流将是

123\n

有四个char ; '1''2''3''\\n'
首先getchar读取1然后putchar输出这个字符。 现在缓冲区有23\\n 接下来调用getchar读取2并在其旁边读取3 最后\\n留下来接下来调用getchar 因此输出将是

123

现在逐个输入字符,如第一个例子中所示。 在传递j您将j\\n传递给缓冲区。 第一次调用getchar将读取j并且putchar在屏幕上输出。 下一个调用将读取\\n并且putchar在屏幕上打印出来但在读取下一个字符之前看不到效果。 在第三次调用getchar ,会读取b ,但这次它会进入输出屏幕的下一行。 这是因为之前由getchar读取的\\n字符。 最后\\n留在缓冲区中,以便下次调用getchar

现在来看你的第一个例子

#include <stdio.h>

// copy input to output; 1st version
int main()
{
    int c;

    while((c = getchar()) != EOF) 
    {
        putchar(c);
    }
} 

这将与上述类似地起作用。

现在来看你的第二个例子

#include <stdio.h>

// copy input to output; 1st version
int main()
{
    int c;

    while((c = getchar()) != EOF) 
    {
        putchar(c);
        printf("\n");
    }
} 

这是在每个字符之后打印两个换行符但是应该打印一个字符,对吗?

它打印应该是什么! 这是因为它不仅为字符jb等打印换行符,而且还为换行符\\n打印换行符。 采用简单的输入j\\nb\\n
在第一次调用getchar ,读取j并使用printf打印换行符,然后在下一次调用时打印\\n与换行符一起打印,输出看起来像

j
    //The newline printed by printf along with j    
    //The newline printed by printf along with \n 
b   

它并没有回应换行符。 getchar()是缓冲输入。 此外, getchar()是回显类型。 控件将一直等到您按下键盘上的Enter键。

如果你这样做

abcde 回车

因为getchar()是echo类型,所以它从缓冲区中读取单个char ,直到它遇到newline并且回显相同的char putchar()在终端上打印收到的char 当您按Enter键时,您输入正在输出的换行符。

在第二种情况下会发生同样的事情,但由于printf会添加一行额外的行。

查看http://ideone.com/H2kqBq

#include <stdio.h>
int main()
{
int c;

while((c = getchar()) != EOF)
{
    putchar(c);
    printf("\n");
}
}

输出不是您在此处指定的。

getchar()和putchar()的行为是一致的

在我看来发生的事情是,当你在终端输入一个字符时,假设'a'然后按Enter ,实际上two characters在输入流中被缓冲

'a' and '\n'

所以loop运行两次to putchar these two characters ,这就是你的下一个输入从新行开始的原因

(您可以使用以下方式检查:

if(c!='\n') putchar(c);

这将导致'\\ n'不打印,你会在同一行输入)

当你添加printf("\\n") ,它也会被打印两次,因为循环仍会运行两次,因为输入流中有两个字符。

所以你会得到的

a
(newline from printf)

在循环的first iteration

(newline from input buffer)
(newline from printf)

second iteration

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM