getchar() 和 putchar()

6
在这个例子中:
#include <stdio.h>

main()
{
    long nc;

    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}

我不太理解。putchar()函数会输出字符,但是为什么在EOF之后它会输出所有字符,并且它是如何记住这些字符的呢?谢谢。


6
这段代码中似乎没有 putchar()。 - SoapBox
你在说哪个putchar() - mob
2
我认为您从K&R发布了错误的程序! - Alok Singhal
4个回答

8

这被称为缓冲,由操作系统完成。通常情况下,它执行行缓冲,只是将您输入的每个字符保存在内存中,然后在遇到换行符时将其全部写入文件。这样做可以节省资源,因为文件操作比其他操作花费更多时间。因此,它不会对每个单独的字符进行输出,而是等待一堆字符收集到缓冲区,并一次性将它们全部写出。

这只是操作系统的一个巧妙的操作,您作为程序员不需要担心。只需一次输入一个字符,让操作系统以自己的方式处理剩余部分即可。


这不是由标准库完成的吗,而不是操作系统? - user129393192

2

[这不是答案,但你不能在评论中放置代码]

我觉得你的意思是这样的:

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    char c;
    while ((c = getchar()) != EOF)
    {
       putchar(c); /* prints one char */
        ++nc;
    }
    printf("%ld\n", nc); /* prints the number of characters read */
}

1

这段代码只清空输入并在刷新之前写入剩余字符数,以确保输入文件(stdin)中没有剩余字符。


1

putchar将字符放入缓冲区,当输入回车时,它会将该行单词输出到屏幕上。


谢谢!我也在想为什么字符在键入时不会显示在屏幕上,尽管循环中有putchar()(不在上面的代码中,但在KR的示例中)。 - Curious2learn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接