为什么getchar()表现不同?

时间:2013-12-25 09:19:49

标签: c getchar

我发现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

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

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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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会在屏幕上输出此内容。下一个电话会显示putchargetchar在屏幕上打印出来,但在读取下一个字符之前,您看不到效果。在b的第三次调用时,会读取\n,但这次它会转到输出屏幕上的下一行。这是因为getchar之前读取的\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");
    }
} 

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

现在来看你的第二个例子

j

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

它打印应该是什么!这是因为它不仅为字符b\n ...等打印换行符,而且还为换行符j\n打印换行符。采用简单输入b\ngetcharj的第一次通话时,printf读取并打印换行符,然后在下一个电话\n上打印新行,输出看起来像

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

答案 2 :(得分:0)

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

如果你这样做

abcde 输入

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

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

答案 3 :(得分:0)

检查http://ideone.com/H2kqBq

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

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

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

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

答案 4 :(得分:0)

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

'a' and '\n'

所以loop运行两次到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

中的