鍵盤輸入EOF, 爲何循環還不停止

在K&R的C語言教程裏看到這段程序,關於輸入字母計數的程序,如下:

#include<stdio.h>
void main()
{
  long coff=0;
  while(getchar()!=EOF)
     coff++;
  printf("%ld\n",coff);
}

代碼不復雜,只有在鍵盤輸入EOF鍵時,循環纔會結束。

那麼如何才能從鍵盤輸入EOF呢?(我的編程環境是 windows 7 + visual studio 2010)

查了一下資料: 

http://bbs.csdn.net/topics/310129688

http://en.wikipedia.org/wiki/End-of-file

發現在Windows 下,輸入 ctrl+z 或者F6 鍵是可以代表EOF的,但是具體的情況有點怪異。

例如輸入 “abcd^z 回車” 時,程序還在繼續,繼續後在新的一行輸入 “^z 回車” 時,程序才結束,輸出5。 

如果輸入  “abcd^Z^Z^Z 回車 ^Zefg 回車” ,  還是輸出5。這說明:

  1. 第一行內的三個^Z^Z^Z並沒有算三次;
  2. 第二行開頭的^Z後面三個字母efg 並沒有計算到coff裏,也就是說,程序運行到了接收字母e 時,已經跳出了循環
  3. abcd 四個字母,再加一次回車,所以輸出是5 (如果中間輸入兩次回車,也就是“abcd^Z^Z^Z 回車 回車 ^Zefg 回車”輸出是6,就說明)
  4. while循環遇到^Z開頭的新的一行就結束了,無論後面有多少字母,這些輸入的字母都沒有影響到coff的值


歸納一下上述第一個討論鏈接的內容,可以大概這樣理解EOF:

在行緩衝裏,如果EOF前面還有字符,那麼操作系統不會產生EOF,只有前面沒有任何字符的時候纔會產生。


然後這是另一個小節,關於putchar()函數的 (待續)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章