对于C语言中学习书籍中的的经典之经典《C程序设计语言》,有一道题的参考答案,有些不理解,多方百度之后,算是有了些了解。
如题:
练习 1-8. 写一个程序,统计输入中的空格、制表符和换行符的个数。
以下是参考程序:
#include <stdio.h>
int main(void)
{
int blanks, tabs, newlines;
int c;
int done = 0;
int lastchar = 0;
blanks = 0;
tabs = 0;
newlines = 0;
while(done == 0)
{
c = getchar();
if(c == ' ')
++blanks;
if(c == '\t')
++tabs;
if(c == '\n')
++newlines;
if(c == EOF)
{
if(lastchar != '\n')
{
++newlines; /* this is a bit of a semantic stretch, but it copes
* with implementations where a text file might not
* end with a newline. Thanks to Jim Stad for pointing
* this out.
*/
}
done = 1;
}
lastchar = c;
}
printf("Blanks: %d\nTabs: %d\nLines: %d\n", blanks, tabs, newlines);
return 0;
}
这就得谈到EOF的作用机理了。
1.EOF作为文件结束符时的情况:(以Windows系统下讲解)
EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+Z都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。
(1)遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl+Z,就可以跳出getchar(),去执行程序的其他部分;
(2)在前面输入的字符为换行符时,接着输入Ctrl+Z;
(3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+Z,这时第二次输入的Ctrl+Z起到文件结束符的功能,至于第一次的Ctrl+Z的作用将在下面介绍。
其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+Z才相当于文件结束符。
2.EOF作为行结束符时的情况,这时候输入Ctrl+Z并不能结束getchar(),而只能引发getchar()提示下一轮的输入。
这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+Z,此时的Ctrl+Z并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。
其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。
从这里也可以看出Ctrl+D和换行符分别作为行结束符时,输出的不同结果。
EOF的作用也可以总结为:当终端有字符输入时,Ctrl+Z产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;
当终端没有字符输入或者可以说当getchar()读取新的一次输入时,
输入Ctrl+Z,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。
上述EOF的作用机理参考自博客点击打开链接
由此,我们可以知道,当我试了试,用codeblack编译,发现EOF的输入在前一个字符为换行符‘\n’”的情况下,才能结束输入。
我也很绝望呀,时间有限,希望日后弄懂,或有大神指教。