getchar()和EOF總結

getchar()EOF總結 函數

師級經典的著做,要字斟句酌的去,去理解。之前在看K&RThe C Programming Language(SecondEdition)
1.5的字符/出,被getchar()EOF所迷惑了。可能主要是因爲沒有搞清楚getchar()的工做原理和EOF的用法。所以,頗有必要總結一下,否則,不少碎的知長時間過後就會淡忘的,只有寫下來纔是最好的方法。


getchar()最典型的程序也就幾行代而已。本人所用的境是DebianGNU/Linux,在其餘系下也一
1、getchar的兩點總結
1.getchar
是以行爲單行存取的。
當用getchar,若是入的第一個字符有效字符(入是文件束符EOFWindows爲組Ctrl+Z Unix/Linux爲組Ctrl+D),那只有當最後一個入字符爲換行符'\n'(也能夠是文件束符EOFEOF將在後面討論) getchar纔會中止行,整個程序將會往行。譬以下面程序段: spa

while((c = getchar()) != EOF){
    putchar(c);
} orm


行程序,入:abc,而後回程序就會去puchar(c),而後abc個地方不要忘了,系統輸出的有一個回。而後能夠繼續輸入,再次遇到行符的候,程序又會把那一行的入的字符出在端上。


getchar,確定不少初學的朋友會getchar不是以字符爲單取的?那,既然我入了第一個字符a,確定滿while(c = getchar()) != EOF的條件阿,那麼應該執putchar(c)出一個字符a。不,我在用getchar候也是一直這麼想的,可是程序就恰恰不着樣執行,而是必需到一個行符或者文件束符EOF行一次出。

對這問題的一個解是,在大師編C候,當並無所謂終入的概念,全部的實際上都是按照文件取的,文件中通常都是以行爲單位的。所以,只有遇到行符,那程序會認爲輸束,而後採起行程序的其餘部分。同入是按照文件的方式存取的,那束一個文件的入就需用到EOF (Enf Of File). 也就是getchar入退出要用EOF的緣由。

2.getchar()
的返回通常狀況下是字符,但也多是負值,即返回EOF

裏要強調的一點就是,getchar函數一般返回端所入的字符,些字符系對應ASCII都是非的。所以,不少候,我會寫這樣的兩行代 ci

char c;
c = getchar(); get


這樣就頗有可能出現問題。因getchar函數除了返回入的字符外,在遇到Ctrl+D(Linux)即文件束符EOFgetchar ()的返回EOFEOF在函數裏通常定義爲-1。所以,在這種狀況下,getchar函數返回一個負值,把一個負值賦給一個char型的量是不正確的。了能夠讓所定量能包含getchar函數返回的全部可能的,正確的定方法以下(K&R C中特提到了問題)it

int c;
c = getchar();io

2、EOF的兩點總結(主要指普通端中的EOF)
1.EOF
文件束符的狀況:

EOF
然是文件束符,但並非在任何狀況下Ctrl+D(WindowsCtrl+Z)都能夠實現文件束的功能,只有在下列的條件下,才做文件束符。
(1)
遇到getcahr函數,要入第一個字符就直接Ctrl+D,就能夠跳出getchar(),行程序的其餘部分;
(2)
在前面入的字符爲換行符,接着Ctrl+D
(3)
在前面有字符入且不爲換行符,要入兩次Ctrl+D這時第二次入的Ctrl+D起到文件束符的功能,至於第一次的Ctrl+D的做用將在下面介
狀況均可以總結爲只有在getchar()提示新的一次,直接Ctrl+D才至關於文件束符。

2.EOF
束符的狀況,這時Ctrl+D並不能getchar(),而只能引getchar()提示下一入。

這種狀況主要是在getchar()新的一行,當入了若干字符(不能包含行符)以後,直接Ctrl+D,此Ctrl+D並非文件束符,而只是至關於行符的功能,即束當前的入。以上面的代例,若是時輸abc,而後Ctrl+D,程序
abcabc

注意:第一abc入的,而後Ctrl+D,就出第二abc,同停在第二字符的c後面,而後能夠行新一次的入。這時若是再次Ctrl+D起到了文件束符的做用,getchar()。
若是abc以後,而後回行符的則終
abc         //
第一行,
abc         //
第二行
               //
第三行

其中第一行爲終入,第二行爲終出,光停在了第三行,等待新一次的入。
裏也能夠看出Ctrl+D行符分table

相關文章
相關標籤/搜索