[英]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");
}
}
这是在每个字符之后打印两个换行符但是应该打印一个字符,对吗?
它打印应该是什么! 这是因为它不仅为字符j
, b
等打印换行符,而且还为换行符\\n
打印换行符。 采用简单的输入j\\n
, b\\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
会添加一行额外的行。
#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.