C程序语言中统计换行符'\n'例程的lastchar作用

对于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;
} 


其中的 lastchar的用处实在令人有些不解。

这就得谈到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’”的情况下,才能结束输入。

我也很绝望呀,时间有限,希望日后弄懂,或有大神指教。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值