putchar()和getchar()循环说明

时间:2016-02-21 21:14:02

标签: c

我的问题如下:

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

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

这两个做同样的事情。我的问题是它们是如何工作的?为什么他们都产生相同的结果?

就我的理解而言,让我们以第一个为例,它读取一个字符,而不是EOF->进入putchar(printchar在屏幕上)然后进入另一个char。但是让我说我​​输入类似“Hello”的东西,它会输出Hello,如何以及为什么?为什么它不仅仅输出5x H - > HHHHH?

4 个答案:

答案 0 :(得分:0)

putchar是C编程语言中的一个函数,它将单个字符写入标准输出流stdout。

C库函数int getchar(void)从stdin获取一个字符(unsigned char)。这相当于带有stdin的getc

希望这有助于。

答案 1 :(得分:0)

简单。

你同意

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

相当于

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

从第二个到最后的每个来电,因为如果你在循环结束时将新值分配给c然后comapre到EOF或者执行此操作并不重要在循环停止条件下的一次调用中。

但除了第一个电话之外的所有电话都是如此。如果你离开了

int c;
c = getchar();
在循环之前

而不是第一次调用,您将评估c = getchar()两次。所以我们必须删除它,我们留下:

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

答案 2 :(得分:0)

第一个循环

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

在第二个循环

中分配循环体内stdin中的内容

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

将赋值与循环逻辑表达式中的比较结合起来。这是由于C和许多其他语言中的评估顺序(您也可以在Java中执行相同的操作)。因此,您从第一个术语(在本例中为表达式)中获取c的值,然后将其与EOF进行比较。

顺便说一下,我会将第一个循环更改为

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

通过这种方式,您无需为c预先指定一个值,直接为putchar()提供的内容。

答案 3 :(得分:0)

这是一个老问题,但我会回答,因为我相信其他人在学习《C 编程语言第二版》这本书时也会有同样的问题。这就是我自己偶然发现这个问题的方式。以下是我发现的。

字符输入由 getchar() 函数求值,进入循环。在循环中执行 putchar(c) 后,将写入标准输出缓冲区。

putchar(c) 没有立即将字符打印到控制台的原因是因为输出缓冲区写入控制台的方式。在遇到换行符 (\n) 之前,输出缓冲区不会写入控制台。

因此,如果您在控制台上键入“Hello”并按 Enter 键,您将向程序发送 Hello\n。按回车键发送换行符 (\n) int 值。在 while 循环中由 getchar() 评估最后一个 int 后,您将获取换行符 (\n),随后在调用 putchar(c) 时将 \n 换行符 int 值写入缓冲区。缓冲区遇到 \n 触发输出缓冲区将所有存储在输出缓冲区中的值写入控制台。