目錄
EOF是什么?
EOF搭配while的實(shí)際應(yīng)用場(chǎng)景1
EOF搭配while的實(shí)際應(yīng)用場(chǎng)景2
補(bǔ)充
后言
EOF是什么?
EOF, 在C語(yǔ)言的標(biāo)準(zhǔn)函數(shù)庫(kù)中表示文件結(jié)束符(end of file)。在while循環(huán)中以EOF作為文件結(jié)束標(biāo)志,這種以EOF作為文件結(jié)束標(biāo)志的文件,必須是文本文件。
在文本文件中,數(shù)據(jù)都是以字符的ASCII代碼值的形式存放。我們知道,ASCII代碼值的范圍是0~127(ASCII的取值范圍應(yīng)該為0~255,0~127保留的是英文、數(shù)字和標(biāo)準(zhǔn)符號(hào),128~255是后面進(jìn)行拓展的ASCII),不可能出現(xiàn)-1,但正好EOF是定義在頭文件<stdio.h>的常量,EOF的本質(zhì)是-1(ASCLL)。因此可以用EOF作為文件結(jié)束標(biāo)志。
還有很多文件處理函數(shù)處錯(cuò)誤后的返回值也是EOF,因此常被用來(lái)判斷調(diào)用一個(gè)函數(shù)是否成功。
EOF搭配while的實(shí)際應(yīng)用場(chǎng)景1
#include <stdio.h>
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
}
return 0;
}
當(dāng)上面的程序運(yùn)行時(shí),如果不加" != EOF",那么這個(gè)程序就是個(gè)死循環(huán),會(huì)一直運(yùn)行下去。
但如果加上" != EOF"后該程序就不是死循環(huán)了,如果在終端不進(jìn)行輸入該程序會(huì)自動(dòng)結(jié)束。
(while的意思就是說(shuō)當(dāng)前輸入緩存還有東西時(shí)就一直讀取,直到輸入緩存中的內(nèi)容為空時(shí)停止)
如何結(jié)束程序呢?
在終端(黑框)中手動(dòng)輸入時(shí),系統(tǒng)并不知道什么時(shí)候到達(dá)了所謂的“文件末尾”。
因此需要用<Ctrl + z>組合鍵然后按 Enter 鍵的方式來(lái)告訴系統(tǒng)已經(jīng)到了EOF,這樣系統(tǒng)才會(huì)結(jié)束while。
以下題為例:
?
?
·從上代碼可見(jiàn),在VS2019的情況下,需要三次<Ctrl + z>組合鍵
·上面我們說(shuō)了EOF的本質(zhì)是-1,這里又有小伙伴迷惑了,那scanf怎么能和-1相比較呢?
其實(shí)scanf函數(shù)返回值是實(shí)際讀到數(shù)據(jù)的個(gè)數(shù)。例如我們輸入4,那我們的scanf函數(shù)讀到的數(shù)據(jù)個(gè)數(shù)就是1,1不等于-1,進(jìn)入while循環(huán)。
參考scanf函數(shù)詳解
我們不論在scanf函數(shù)中輸入什么,要讓讀到數(shù)據(jù)的個(gè)數(shù)永遠(yuǎn)都不可能等于-1(即讓scanf讀取正常),這樣循環(huán)就不停止,就可以多組輸入。所以下面寫法也是正確的。
while(scanf("%d",%i) == 1)
如果輸入正常,則scan返回值為輸入數(shù)據(jù)的個(gè)數(shù)(>=1的值),所以while循環(huán)條件為真,執(zhí)行循環(huán)。
直到scanf輸入為假(Ctrl+Z或者輸入類型不匹配的數(shù)據(jù)類型),則返回值為-1或者0。因?yàn)閟canf返回值不等于1,所以while循環(huán)條件為假,不再執(zhí)行循環(huán)。
EOF搭配while的實(shí)際應(yīng)用場(chǎng)景2
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int ch;
while ((ch = getchar()) != EOF) putchar(ch);
}
?從上面代碼和運(yùn)行結(jié)果可以看出,EOF搭配while可以控制 字符串輸入個(gè)數(shù)。
當(dāng)然用法不止這些,需要自己去探索
補(bǔ)充
當(dāng)系統(tǒng)在檢測(cè)緩沖區(qū)中是否含有流結(jié)束標(biāo)志時(shí),有兩種檢測(cè)方式:阻塞式和非阻塞式
1.阻塞式:指的是只有在回車鍵按下之后,才會(huì)對(duì)緩沖區(qū)中是否含有ctrl+z組合鍵進(jìn)行檢查。需要注意的是,當(dāng)緩沖區(qū)中含有可讀數(shù)據(jù)時(shí),ctrl+z就不是結(jié)束標(biāo)志。我們需要明白,ctrl+z產(chǎn)生的并不是一個(gè)普通的ASCⅡ碼值,也就是說(shuō)它不會(huì)跟其他從鍵盤上輸入的字符一樣,它是不能夠存放在輸入緩沖區(qū)中的。
2.非阻塞時(shí):指的是一旦按下ctrl+d之后立即響應(yīng)。
如果之前沒(méi)有輸入字符,那么ctrl+d就是流結(jié)束標(biāo)志。
如果之前已經(jīng)輸入了字符,那么ctrl+d此時(shí)就相當(dāng)于回車不再是流結(jié)束標(biāo)志,并且具有回車的功能(將輸入字符送入緩沖區(qū)),并且這個(gè)回車自己也會(huì)進(jìn)入緩沖區(qū)?。?!
當(dāng)然了windows系統(tǒng)一般采用阻塞式檢查(ctrl+z),linux系統(tǒng)一般采用非阻塞式檢查(ctrl+d)
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-496317.html
后言
本篇作為本人剛開(kāi)始學(xué)習(xí)以來(lái)第一篇技術(shù)性博客,可能存在沒(méi)解釋通、漏解釋、或者解釋錯(cuò)誤的地方。希望各位可以在評(píng)論區(qū)指出我的問(wèn)題,如果可以得到您的解決方案,我將不勝感激。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-496317.html
到了這里,關(guān)于【C語(yǔ)言】EOF搭配while循環(huán)來(lái)控制scanf輸入的次數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!