getchar()
是C语言里一个字符输入函数,当它被调用的时候会从当前的文本流中读取一个
字符, 并将其结果返回,我们看下面的一段程序:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int c, n;
while ((c = getchar()) != EOF) {
++n;
}
printf("\"n\" = %d\n", n);
return 0;
}
注意:
这里的字符c
之所以声明为int
而不是char
,是因为EOF
的值是-1
,我们不能把-1
赋值给一个char
变量。而且char
本身就是int
类型 。
上面程序的意思是:
我们从输入流里面读取一个字符, 并把这个字符赋值给c
, 如果c
不是文件结束符EOF
的话,我们就把n
加上1,继续读取下一个字符并且赋值给c
,继续我们的循环 。
如果c
是文件结束符,那么退出循环,程序继续运行(也就是打印字符个数n
)。
可是运行程序我们会发现,在我们输入一段字符串并回车的时候,循环并不会结束,终端还会提示我们继续输入。
这是因为Enter
在ASCII码中也是一个字符(ASCII码为13),也就是说while循环并没有结束。
怎么才能输入
EOF
呢?
在Linux下是control + d
下面我们运行程序,输入asdfg
,回车,control + d
,我们很高兴看到终端打印出如下信息:
"n" = 6
Program ended with exit code: 0
n=6
是因为我们还输入了一个回车。
然后我们发现了另外一个问题,如果我们在输入asdfg
之后,并没按回车,而是直接control + d
,程序并没有往下运行,而是依然处于“阻塞”状态。这又是为什么?
==============以下引用自百度文库==============
因为EOF
虽然是文件结束符,但并不是任何情况下输入control + d
都能实现文件结束的功能的,只有在下列情况下输入control + d
才会有效:
1.遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl+D;
2.在前面输入的字符为换行符时,接着输入Ctrl+D;
3.在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,至于第一次的 Ctrl+D作为行结束符。
其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时, 直接输入Ctrl+D才相当于文件结束符。
为了说明这个问题,我们在while循环中插入一段代码,插入后的程序如下:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int c, n;
while ((c = getchar()) != EOF) {
putchar(c);
++n;
}
printf("\"n\" = %d\n", n);
return 0;
}
我们插入了一个putchar()
函数用于输出。
这时,我们输入qwer
,然后control + d
, 我们来看终端的打印结果:
qwerqwer
其中前面的qwer
是我们输入的,后边的才是打印结果。然后出现了光标(也就是说我们可以继续输入),这时,如果我们继续control + d
,终端会打印
Program ended with exit code: 0
程序结束,我们就不能输入了。
至此,我们可以看出control + d
作为行结束符
和文件结束符
的区别。