我发现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
它回应了换行符,在之前的情况下曾经被忽略过。
你能告诉我为什么会有区别,它的表现如何?
答案 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
会在屏幕上输出此内容。下一个电话会显示putchar
并getchar
在屏幕上打印出来,但在读取下一个字符之前,您看不到效果。在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\n
,getchar
在j
的第一次通话时,printf
读取并打印换行符,然后在下一个电话\n
上打印新行,输出看起来像{ p>
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
并且回显相同的char
。 putchar()
打印终端上收到的char
。当您按 Enter 时,您输入正在输出的换行符。
在第二种情况下会发生同样的事情,但由于printf
而添加了一行额外的行。
答案 3 :(得分:0)
#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
中的