关于C#:getchar()和putchar()

getchar() and putchar()

在示例中:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

main()
{
    long nc;

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

我不太明白。 putchar()会将字符放出,但为什么在EOF之后将所有字符放出,又在哪里记住所有这些字符呢? 谢谢。


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

这只是OS,您作为程序员无需担心的巧妙操作。只需将您的角色一一扔掉,然后让操作系统以自己的方式处理其余的角色。


[这不是答案,但是您不能在注释中添加代码]

我认为您的意思是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

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

putchar在进入enter时将char放入缓冲区,然后它将行字输出输出到屏幕。


让我们回顾一下您的代码:

1
#include <stdio.h>

到现在为止还挺好...

1
2
main()
{
  • main()函数始终返回
    int。总是。
  • 声明函数不返回
    类型是可怜的形式,因为它默认为
    int,但人们不记得了
    这在读取代码时很容易。
  • 继续 ...

    1
    2
    3
    long nc;

    nc = 0;

    好形式。变量在使用前已初始化。

    1
    2
    while (getchar() != EOF)
        ++nc;

    这有点复杂。但是一次只一步。

  • getchar函数返回一个
    来自标准输入的int
  • 然后将该值与
    EOF
  • 如果int值来自标准
    输入不是EOF,变量
    nc递增。
  • 因此,要退出while循环,必须从标准输入生成EOF。

    注意:从标准输入读取的值均未保存。计算表达式后,将丢弃每个值。

    风格:我建议在每个while语句之后使用'{'和'}'。这是一个安全的习惯。

    1
    2
    printf("%ld\
    "
    , nc);

    上面的语句正在打印(显示)nc中的值。 nc中的值表示从标准输入读取的字符数。该语句不显示标准输入中的任何字符。

    1
    }

    最后,main程序必须向操作系统返回一个值。在stdlib.h中定义的两个可移植值是EXIT_SUCCESSEXIT_FAILURE。指定这些值之一也是一个好习惯。

    顺便说一句,您发布的示例中没有putchar(我已复制到此答案中)。


    没有地方,这段代码仅清空输入内容,并写出冲洗前剩余的角色数。

    确保输入文件(stdin)中没有剩余字符