getchar()
是C語言里一個(gè)字符輸入函數(shù),當(dāng)它被調(diào)用的時(shí)候會(huì)從當(dāng)前的文本流中讀取一個(gè)
字符宛逗, 并將其結(jié)果返回取刃,我們看下面的一段程序:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int c, n;
while ((c = getchar()) != EOF) {
++n;
}
printf("\"n\" = %d\n", n);
return 0;
}
注意:
這里的字符c
之所以聲明為int
而不是char
绢淀,是因?yàn)?code>EOF的值是-1
,我們不能把-1
賦值給一個(gè)char
變量涣狗。而且char
本身就是int
類型 谍婉。
上面程序的意思是:
我們從輸入流里面讀取一個(gè)字符, 并把這個(gè)字符賦值給c
镀钓, 如果c
不是文件結(jié)束符EOF
的話穗熬,我們就把n
加上1,繼續(xù)讀取下一個(gè)字符并且賦值給c
丁溅,繼續(xù)我們的循環(huán) 唤蔗。
如果c
是文件結(jié)束符,那么退出循環(huán)窟赏,程序繼續(xù)運(yùn)行(也就是打印字符個(gè)數(shù)n
)妓柜。
可是運(yùn)行程序我們會(huì)發(fā)現(xiàn),在我們輸入一段字符串并回車的時(shí)候涯穷,循環(huán)并不會(huì)結(jié)束棍掐,終端還會(huì)提示我們繼續(xù)輸入。
這是因?yàn)?code>Enter在ASCII碼中也是一個(gè)字符(ASCII碼為13)拷况,也就是說while循環(huán)并沒有結(jié)束作煌。
怎么才能輸入
EOF
呢?
在Linux下是control + d
下面我們運(yùn)行程序赚瘦,輸入asdfg
粟誓,回車,control + d
起意,我們很高興看到終端打印出如下信息:
"n" = 6
Program ended with exit code: 0
n=6
是因?yàn)槲覀冞€輸入了一個(gè)回車鹰服。
然后我們發(fā)現(xiàn)了另外一個(gè)問題,如果我們?cè)谳斎?code>asdfg之后,并沒按回車悲酷,而是直接control + d
套菜,程序并沒有往下運(yùn)行,而是依然處于“阻塞”狀態(tài)设易。這又是為什么笼踩?
==============以下引用自百度文庫==============
因?yàn)?code>EOF雖然是文件結(jié)束符,但并不是任何情況下輸入control + d
都能實(shí)現(xiàn)文件結(jié)束的功能的亡嫌,只有在下列情況下輸入control + d
才會(huì)有效:
1.遇到getcahr函數(shù)執(zhí)行時(shí),要輸入第一個(gè)字符時(shí)就直接輸入Ctrl+D掘而;
2.在前面輸入的字符為換行符時(shí)挟冠,接著輸入Ctrl+D;
3.在前面有字符輸入且不為換行符時(shí)袍睡,要連著輸入兩次Ctrl+D知染,這時(shí)第二次輸入的Ctrl+D起到文件結(jié)束符的功能,至于第一次的 Ctrl+D作為行結(jié)束符斑胜。
其實(shí)控淡,這三種情況都可以總結(jié)為只有在getchar()提示新的一次輸入時(shí), 直接輸入Ctrl+D才相當(dāng)于文件結(jié)束符止潘。
為了說明這個(gè)問題掺炭,我們?cè)趙hile循環(huán)中插入一段代碼,插入后的程序如下:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int c, n;
while ((c = getchar()) != EOF) {
putchar(c);
++n;
}
printf("\"n\" = %d\n", n);
return 0;
}
我們插入了一個(gè)putchar()
函數(shù)用于輸出凭戴。
這時(shí)涧狮,我們輸入qwer
,然后control + d
么夫, 我們來看終端的打印結(jié)果:
qwerqwer
其中前面的qwer
是我們輸入的者冤,后邊的才是打印結(jié)果。然后出現(xiàn)了光標(biāo)(也就是說我們可以繼續(xù)輸入)档痪,這時(shí)涉枫,如果我們繼續(xù)control + d
,終端會(huì)打印
Program ended with exit code: 0
程序結(jié)束腐螟,我們就不能輸入了愿汰。
至此,我們可以看出control + d
作為行結(jié)束符
和文件結(jié)束符
的區(qū)別遭垛。