国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

超詳解 - 如何理解C語(yǔ)言中while(scanf(“%d“, &num) != EOF)這一表達(dá)式?

這篇具有很好參考價(jià)值的文章主要介紹了超詳解 - 如何理解C語(yǔ)言中while(scanf(“%d“, &num) != EOF)這一表達(dá)式?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

許多C語(yǔ)言初學(xué)者常常對(duì)scanf函數(shù)、表達(dá)式scanf("%d", &num) != EOF的含義與其使用情況有些疑惑。

本文通過(guò)一道??途W(wǎng)例題,對(duì)該表達(dá)式進(jìn)行說(shuō)明和適當(dāng)拓展;不需要引例的朋友可以直接跳轉(zhuǎn)到講解部分。

希望對(duì)諸位讀者有所幫助。

目錄

一、引例 - ??途W(wǎng)OJ題

二、EOF 與 scanf 函數(shù)的關(guān)系

1. EOF (End Of File)? ?

2. scanf 函數(shù)? ??

scanf 演示?

三、while(scanf("%d", &num) != EOF)的使用

四、總結(jié)


一、引例 - 牛客網(wǎng)OJ題

為了更好地說(shuō)明這個(gè)表達(dá)式,我們以一道??途W(wǎng)的題目作引例。題目鏈接貼在這里:??途W(wǎng)習(xí)題-BC49 判斷兩個(gè)數(shù)的大小關(guān)系https://www.nowcoder.com/practice/f05358b9e8164b27871c87d3097f4dab?tpId=107&&tqId=33330&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking

題干如下

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

這道題的題意非常簡(jiǎn)單,思路也非常明確,程序大體僅需簡(jiǎn)單的?if 分支即可實(shí)現(xiàn)。經(jīng)過(guò)一番思考咱們自信地寫(xiě)下如下代碼:

/*Wrong!*/
#include<stdio.h>

int main(){
    int x,y;
    scanf("%d %d",&x,&y);
    if(x > y)
        printf("%d>%d",x,y);
    else if (x = y)
        printf("%d=%d",x,y);
    else
        printf("%d<%d",x,y);
    return 0;
}

然而將該代碼提交給??途W(wǎng)OJ,卻無(wú)法通過(guò)所有用例:

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

說(shuō)明告訴我們,當(dāng)用例連續(xù)輸入多組(3組)時(shí),上面的代碼沒(méi)法做到一口氣輸出這3組用例相應(yīng)的答案,而僅僅是輸出了第一個(gè)用例(1 1)的答案。顯然,上面的程序 scanf 在讀取了一組輸入用例后就跑路了,無(wú)法做到題干要求的能輸入 “多組輸入數(shù)據(jù)” 。我們的答案程序被斃了。

也許循環(huán)可以解決上面的bug,于是咱們嘗試以下代碼:

/*Wrong!*/
#include<stdio.h>

int main(){
    int x,y;
    for(int i=0; i<3; i++){
        scanf("%d %d",&x,&y);
        if(x > y)
            printf("%d>%d\n",x,y);
        else if (x == y)
            printf("%d=%d\n",x,y);
        else
            printf("%d<%d\n",x,y);
    }
    return 0;
}

試圖用 for 循環(huán)來(lái)達(dá)到?“輸入多組用例” 的要求。?事實(shí)上也不可行,該程序的邏輯是:輸入一組用例,執(zhí)行這一組用例,再通過(guò) for 循環(huán)再輸入一組用例,再執(zhí)行……并不是一次性輸入多組用例且同時(shí)打印多組答案。

因而,本題能被??途W(wǎng)OJ通過(guò)的關(guān)鍵是能做到多組輸入。如何實(shí)現(xiàn),用到的就是我們今天要講解的重點(diǎn):while(scanf("%d", &num) != EOF)

如下是該題的一個(gè)正確答案(事實(shí)上所有的正確答案都大同小異,且EOF這句表達(dá)式是必不可少的)

#include<stdio.h>

int main(){
    int a,b;
    while((scanf("%d%d",&a,&b)) != EOF){    //重點(diǎn)在此!
        if(a == b)
            printf("%d=%d\n",a,b);
        else if(a > b)
            printf("%d>%d\n",a,b);
        else
            printf("%d<%d\n",a,b);
        }
    return 0;
}

?二、EOF 與 scanf 函數(shù)的關(guān)系

1. EOF (End Of File)? ?

名稱(chēng)是文件結(jié)束標(biāo)志,定義為?-1(不是ASCII碼值為-1),可以通過(guò) Ctrl+Z 直接鍵入。

2. scanf 函數(shù)? ??

scanf函數(shù)是有返回值的。

一般來(lái)說(shuō),它的返回值是成功讀取的元素個(gè)數(shù)。但當(dāng)遭遇讀取失敗時(shí),它的返回值便是 -1 (也就是它自己返回一個(gè)EOF) 。

而若是一個(gè)元素都還沒(méi)成功讀入的時(shí)候就遇到了讀取失敗或EOF,那它直接就會(huì)返回-1,不管后面再輸入了什么。

Cplusplus官網(wǎng)對(duì) scanf 函數(shù)的說(shuō)明如下:

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

by the way,? getchar()函數(shù)讀取失敗時(shí),也會(huì)返回EOF。

下面這個(gè)網(wǎng)站建議大家收藏,C語(yǔ)言中各種函數(shù)、關(guān)鍵字等等的用法都可以在其中查詢(xún)到。

Cplusplus官網(wǎng)https://cplusplus.com/

scanf 演示?

代碼

int main(){
	int a = 0;
	int b = 0;    //輸入a和b
	int ret = scanf("%d %d",&a,&b);    //用ret接受scanf的返回值
	printf("ret = %d\n",ret);
	printf("a = %d\n",a);
	printf("b = %d\n",b);
	return 0;
}

運(yùn)行結(jié)果

(1) 輸入 a 為7,b 為8,二者被scanf成功讀取,ret為2(成功讀取的元素個(gè)數(shù))。??

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

(2) 輸入 a 為7,b為EOF(先鍵盤(pán)敲Ctrl+Z后再enter),ret變成了1,因?yàn)橹挥衋是成功被讀取的,b并沒(méi)有被成功讀入。

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

(3)輸入a為EOF,b為8,ret變成了-1(即EOF).因?yàn)閟canf在一個(gè)元素也沒(méi)有讀取的時(shí)候就遇到了EOF(就是我們輸入的a,我們?nèi)藶榈妮斎肓薊OF),scanf直接返回-1,程序結(jié)束。

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

(4) 輸入a或b為非數(shù)字,屬于元素類(lèi)型不匹配的情況。

第一個(gè)元素'A'并沒(méi)有被讀入,scanf()會(huì)停留在那,并把字符'A'放回緩沖區(qū)再又繼續(xù)讀取。下一次讀取的時(shí)候,仍然是從'A'開(kāi)始。事實(shí)上,scanf()一直無(wú)法越過(guò)'A'讀到下一個(gè)字符,一直反復(fù)讀入,并陷入了死循環(huán)。在如下程序中,scanf會(huì)直接認(rèn)為讀取結(jié)束了,跳出函數(shù)。

因而該程序終止后,一個(gè)元素也沒(méi)有被讀進(jìn)去,但又不屬于C語(yǔ)言定義下的讀取失敗,ret為0.

若將語(yǔ)句寫(xiě)成while(scanf("%d", &num) != EOF)這樣,效果就是一直死循環(huán)。

(其實(shí)輸完'A'按enter程序就會(huì)直接結(jié)束,而正常情況下敲enter僅僅是輸入下一個(gè)數(shù)而已,這也是二者的一個(gè)差別。)

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

(5) 輸入a為7,b為'A',a在b之前成功讀取了,因而ret為1.?

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

?三、while(scanf("%d", &num) != EOF)的使用

當(dāng)需要多組輸入時(shí),可以用該表達(dá)式控制循環(huán)入口。當(dāng)人為的輸入EOF時(shí),結(jié)束循環(huán)。

代碼演示

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

此時(shí)我一次鍵入第一行的6個(gè)數(shù)字:5 6 10 10 2 3,敲enter,同時(shí)顯示這三組用例的運(yùn)行結(jié)果。注意:此時(shí)我的程序并沒(méi)有結(jié)束!末行光標(biāo)仍然在跳動(dòng),事實(shí)上我還能再接著鍵入幾組數(shù)字!

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享

再又一次輸入三組數(shù)并顯示運(yùn)行結(jié)果后,我敲下Ctrl+Z,此時(shí)控制臺(tái)上顯示了一個(gè) ^Z ,說(shuō)明成功輸入了EOF,再按下enter,出現(xiàn)最下面的橫線與小字,程序結(jié)束!!

我使用的IDE是小熊貓版的devc++,如果在vs 2019中,要輸入三次Ctrl Z才行。這其實(shí)是vs的一個(gè)小bug?。

換成如下代碼,也是可以的:

int main(){
	int a,b;
	while((scanf("%d%d",&a,&b)) == 2){
		if(a == b)
			printf("%d=%d\n",a,b);
		else if(a > b)
			printf("%d>%d\n",a,b);
		else
			printf("%d<%d\n",a,b);
	}
	return 0;
}

while((scanf("%d%d",&a,&b)) == 2) 與??while(scanf("%d", &num) != EOF) 本質(zhì)上等價(jià)。


四、總結(jié)

本文詳細(xì)介紹了scanf 與 EOF 的含義與使用。

1. 當(dāng)需要多組輸入時(shí),使用while(scanf("%d", &num) != EOF)控制循環(huán)入口。

2. 初學(xué)階段了解如何使用即可:可以將EOF直接理解為一個(gè)簡(jiǎn)單的標(biāo)記。當(dāng)我們?cè)趕canf函數(shù)中輸入CTRL + Z時(shí),就能“召喚”出這個(gè)標(biāo)記,從而結(jié)束 scanf 函數(shù),達(dá)到控制循環(huán)的目的。

3.?while((scanf("%d%d",&a,&b)) == 2) 與??while(scanf("%d", &num) != EOF)效果完全相同。

4. 感謝大家支持!如果表述不當(dāng)之處,歡迎各位斧正!


2023年更新:

現(xiàn)在的??途W(wǎng)改版升級(jí)后,默認(rèn)模板中已經(jīng)自帶多組輸入代碼了~

c語(yǔ)言 while(scanf),C語(yǔ)言,c語(yǔ)言,學(xué)習(xí),c++,經(jīng)驗(yàn)分享文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-714765.html

到了這里,關(guān)于超詳解 - 如何理解C語(yǔ)言中while(scanf(“%d“, &num) != EOF)這一表達(dá)式?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C語(yǔ)言基礎(chǔ)考研向】05 scanf讀取標(biāo)準(zhǔn)輸入超詳解

    【C語(yǔ)言基礎(chǔ)考研向】05 scanf讀取標(biāo)準(zhǔn)輸入超詳解

    文章目錄 一.scanf函數(shù)的原理 樣例 問(wèn)題原因 解決方法 二.多種數(shù)據(jù)類(lèi)型混合輸入 錯(cuò)誤樣例 正確樣例 ??C語(yǔ)言未提供輸入/輸出,其輸入和輸出是通過(guò)標(biāo)準(zhǔn)函數(shù)庫(kù)來(lái)實(shí)現(xiàn)的。C語(yǔ)言通過(guò)scanf函數(shù)讀取鍵盤(pán)輸入, 鍵盤(pán)輸入又被稱(chēng)為標(biāo)準(zhǔn)輸入 。當(dāng)scanf函數(shù)讀取標(biāo)準(zhǔn)輸入時(shí),如

    2024年01月22日
    瀏覽(24)
  • 關(guān)于【C語(yǔ)言】中scanf與getchar的用法和常見(jiàn)錯(cuò)誤詳解

    關(guān)于【C語(yǔ)言】中scanf與getchar的用法和常見(jiàn)錯(cuò)誤詳解

    寫(xiě)這篇博客的起因是最近博主自己學(xué)習(xí)中總是遇到類(lèi)似的錯(cuò)誤,并曾百思不得其解。 今天分享出來(lái)是希望幫助大家在寫(xiě)代碼時(shí)避免這些錯(cuò)誤。話不多說(shuō),我們直接開(kāi)始吧! 君兮_的個(gè)人主頁(yè) 勤時(shí)當(dāng)勉勵(lì) 歲月不待人 C/C++ 游戲開(kāi)發(fā) 我們先來(lái)看看再M(fèi)SDN里對(duì)scanf的解釋 - scanf 的功能

    2024年02月05日
    瀏覽(19)
  • C 語(yǔ)言用戶(hù)輸入詳解:scanf、fgets、內(nèi)存地址解析及實(shí)用指南

    您已經(jīng)學(xué)習(xí)了 printf() 函數(shù)用于在 C 語(yǔ)言中輸出值。 要獲取用戶(hù)輸入,可以使用 scanf() 函數(shù): scanf() 函數(shù)接受兩個(gè)參數(shù):變量的格式說(shuō)明符(在本例中為 %d )和引用運(yùn)算符( myNum ),用于存儲(chǔ)變量的內(nèi)存地址。 scanf() 函數(shù)還允許進(jìn)行多個(gè)輸入(例如,在下面的例子中,用戶(hù)可

    2024年02月03日
    瀏覽(20)
  • 從編程語(yǔ)言的角度來(lái)理解正則表達(dá)式

    從編程語(yǔ)言的角度來(lái)理解正則表達(dá)式

    程序代碼是對(duì)現(xiàn)實(shí)事物處理邏輯的抽象,而正則表達(dá)式,則是對(duì)復(fù)雜的字符匹配程序代碼的進(jìn)一步抽象;也就是說(shuō),高度簡(jiǎn)潔的正則表達(dá)式,可以認(rèn)為其背后所對(duì)應(yīng)的,是字符匹配程序代碼,而字符匹配程序代碼,背后對(duì)應(yīng)的是字符匹配處理邏輯。 字符匹配處理邏輯,可以抽

    2024年02月09日
    瀏覽(29)
  • Go基礎(chǔ)12-理解Go語(yǔ)言表達(dá)式的求值順序

    Go語(yǔ)言在變量聲明、初始化以及賦值語(yǔ)句上相比其先祖C語(yǔ)言做了一些改進(jìn),諸如: ● 支持在同一行聲明和初始化多個(gè)變量(不同類(lèi)型也可以) ● 支持在同一行對(duì)多個(gè)變量進(jìn)行賦值 這種語(yǔ)法糖在給我們帶來(lái)便利的同時(shí),也可能帶來(lái)一些令人困惑的問(wèn)題。 Go語(yǔ)言之父Rob Pike在

    2024年02月09日
    瀏覽(31)
  • 【C語(yǔ)言趣味教程】(8) 標(biāo)準(zhǔn) IO 流:輸入和輸出 | 標(biāo)準(zhǔn)輸入 stdin | 標(biāo)準(zhǔn)輸出 stdout | 詳解 printf 和 scanf | 探討 scanf 緩沖區(qū)問(wèn)題和安全性問(wèn)題

    【C語(yǔ)言趣味教程】(8) 標(biāo)準(zhǔn) IO 流:輸入和輸出 | 標(biāo)準(zhǔn)輸入 stdin | 標(biāo)準(zhǔn)輸出 stdout | 詳解 printf 和 scanf | 探討 scanf 緩沖區(qū)問(wèn)題和安全性問(wèn)題

    ??? ?? 《C語(yǔ)言趣味教程》?? 猛戳訂閱!??! 0x00 引入:I/O 的概念 計(jì)算機(jī)中的輸入和輸出,簡(jiǎn)稱(chēng) ,其中: ?代表 Input,即輸入。

    2024年02月09日
    瀏覽(27)
  • C 語(yǔ)言中的 switch 語(yǔ)句和 while 循環(huán)詳解

    替代多重 if..else 語(yǔ)句,可以使用 switch 語(yǔ)句。 switch 語(yǔ)句用于選擇多個(gè)代碼塊中的一個(gè)來(lái)執(zhí)行 switch 表達(dá)式只會(huì)被計(jì)算一次 表達(dá)式的值與每個(gè) case 的值進(jìn)行比較 如果找到匹配,則執(zhí)行相應(yīng)的代碼塊 break 語(yǔ)句用于跳出 switch 塊并停止執(zhí)行 default 語(yǔ)句是可選的,如果找不到匹配的

    2024年02月04日
    瀏覽(20)
  • LangChain 67 深入理解LangChain 表達(dá)式語(yǔ)言30 調(diào)用tools搜索引擎 LangChain Expression Language (LCEL)

    LangChain 67 深入理解LangChain 表達(dá)式語(yǔ)言30 調(diào)用tools搜索引擎 LangChain Expression Language (LCEL)

    LangChain系列文章 LangChain 50 深入理解LangChain 表達(dá)式語(yǔ)言十三 自定義pipeline函數(shù) LangChain Expression Language (LCEL) LangChain 51 深入理解LangChain 表達(dá)式語(yǔ)言十四 自動(dòng)修復(fù)配置RunnableConfig LangChain Expression Language (LCEL) LangChain 52 深入理解LangChain 表達(dá)式語(yǔ)言十五 Bind runtime args綁定運(yùn)行時(shí)參數(shù)

    2024年01月23日
    瀏覽(133)
  • 【C語(yǔ)言初階篇】 while 語(yǔ)句的語(yǔ)法和注意事項(xiàng) (詳解版)

    【C語(yǔ)言初階篇】 while 語(yǔ)句的語(yǔ)法和注意事項(xiàng) (詳解版)

    ?? 鴿芷咕 :個(gè)人主頁(yè) ??? 個(gè)人專(zhuān)欄 :《C語(yǔ)言初階篇》 《C語(yǔ)言進(jìn)階篇》 ??生活的理想,就是為了理想的生活! ?? ?? hello! 各位寶子們大家好啊,又是新的一天開(kāi)始了,今天給大家?guī)?lái)的循環(huán)語(yǔ)句的全面講解! ?? ?? 歷時(shí)一天終于給肝出來(lái)了,本文詳細(xì)講解了wh

    2024年02月14日
    瀏覽(27)
  • getchar函數(shù)詳解看這一篇就夠了-C語(yǔ)言(函數(shù)功能、使用、返回值)

    getchar函數(shù)詳解看這一篇就夠了-C語(yǔ)言(函數(shù)功能、使用、返回值)

    首先要明確getchar的功能是:從計(jì)算機(jī)終端(一般是鍵盤(pán))輸入一個(gè)字符,其值就是輸入得到的字符。 目錄 getchar函數(shù)簡(jiǎn)介 getchar函數(shù)執(zhí)行過(guò)程詳解(配圖) ?getchar用法示例 解釋一下:while ((ch=getchar()) != \\\'EOF\\\') 函數(shù)原型:int getchar(void);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?返回

    2024年02月07日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包