关于C语言中的EOF

程序如下:

 

#include

/*copy input to the output */

main()

{

      int  c;

      while((c = getchar()) != EOF)

            putchar(c);

}

在linux之ubuntu下运行时,怎么退出程序呢?

如果提出了这个问题,就说明绝对不能输入EOF;那么应该怎么结束呢?Ctrl+z 后,出现的是

Ctrl+d之后,就会回到你先前编译运行该文件之前的状态。

 

但是这两者之间到底什么区别呢?下面的分析参照“沧海一粟”的博客的方法试验之:

 

下面图(1)是直接Ctrl+z的结果:

 

下图(2)是输入回车之后,Ctrl+z的结果:

 
下图(3)是直接Ctrl+d的结果。
 
下图(4)是输入回车之后,Ctrl+d的结果:
 
 
解释:
 
1、EOF的值是-1,是int类型数据。在32位系统中,可以表示为0xFFFFFFFF; EOF 不是一个字符,也不是文件中实际存在的内容。EOF不但能表示读文件到了结尾这一状态,它还能表示 I/O 操作中的读、写错误(可以用 ferror() 来检测)以及其它一些关联操作的错误状态。
 
2、在32bit的处理器上,char类型占a single byte,也就是8bit,其无符号字符变量取值范围为0-255,有符号字符变量的取值范围为-128 - 127,;
      同样,short int 类型是16 bit,所以无符号字符变量取值范围为 0 - 65535,有符号字符变量的取值范围为-32768 -  32767;
     那么,long int类型是32bit,相应的为0 - 2^31-1,和 - 2^16 ——2^31-1;
     所以在本文最开始的程序中,c必须存储为int类型,而不是char。
 
3、深层的分析,暂时不懂,引用别人的解释,姑且先接受。等自己懂得更多的时候再记录:
      考虑到系统的实现,首先,输入缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get() 就会检测输入缓冲区中是否有了可读的数据。cin.get() 还会对键盘上是否有作为流结束标志的 “Ctrl+Z”或者 “Ctrl+D”键按下作出检查,其检查的方式有两种:阻塞式以及非阻塞式。

阻塞式检查方式指的是只有在回车键按下之后才对此前是否有“Ctrl+Z” 组合键按下进行检查,非阻塞式样指的是按下“Ctrl+D” 之后立即响应的方式。如果在按 “Ctrl+D”之前已经从键盘输入了字符,则 “Ctrl+D”的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时“Ctrl+D”不再起流结束符的作用。如果按 “Ctrl+D”之前没有任何键盘输入,则 “Ctrl+D”就是流结束的信号

Windows系统中一般采用阻塞式检查 “Ctrl+Z”、Unix/Linux系统下一般采用非阻塞式的检查 “Ctrl+D”。我使用的是Fedora系统,因此使用非阻塞式的 “Ctrl+D”来标识流的结束。

你可能感兴趣的:(C语言)