CodeSky 代码之空

随手记录自己的学习过程

C 输入输出getchar()与putchar()

2014-02-19 19:08分类: C评论: 1

getchar()putchar()其实感觉也挺神奇,因为这货是读/写一个字符,书的引言就说C语言没有处理整个数组或字符串的操作,暂时也只看到这个,感觉还挺好玩的。

书上给的代码是:

1#include <stdio.h>
2
3main(void)
4{
5    int c;
6
7    c = getchar();
8
9    while (c != EOF) {
10        putchar(c);
11        c = getchar();
12    }
13
14}
15

运行一下,会发现我输入什么会输出什么,实际上,是一个个字符来读取,而不是字符串的形式,我脑补了一下,如果计算机处理速度足够慢,大概就能看到一个个字符慢慢出现的景象了。

但是现在足够快了,当时还不是很理解,于是尝试了注释掉代码和换位置。

1#include <stdio.h>
2
3main(void)
4{
5    int c;
6
7    c = getchar();
8
9    while (c != EOF) {
10        putchar(c);
11        //c = getchar();
12    }
13
14}
15

getchar()在循环中读取下一个字符,把它注释掉,就发现一直不停输出你输入的第一个字符,慢慢增加,可以看出一个个输出的效果了。

负责移动的是getchar(),而putchar()其实只负责:输出目前getchar()所在的位置(读入的字符)而已,所以改成:

1#include <stdio.h>
2
3main(void)
4{
5    int c;
6
7    c = getchar();
8    putchar(c);
9    putchar(c);
10    c = getchar();
11    putchar(c);
12/*
13    while (c != EOF) {
14        putchar(c);
15        c = getchar();
16    }
17*/
18}
19

会发现,如果输入是25427785输出是225,这是因为putchar()并没有移动位置(读入下一个字符)。

然后产生了一个新的困惑,为什么第一次getchar()会提示输入,后来就不会了(直到全部输出完)。

实际上每个getchar()还有输入的效果,但当时我们输入的是字符串,可以看成把它丢到了缓冲区:

getchar() 会先从缓冲区里取一个字符,如果缓冲区里没有数据,才要求你输入

此外scanf()getchar()能交替使用printf()putchar()能交替使用。

另外,其实这段程序并不会跳出循环,这是因为没有EOF,必须要手动输入:Win中是CTRL+Z,然后Enter,可见什么是EOF

评论 (1)

Anton2017年6月24日 14:44

mark