你真的會用scanf嗎?

2021-10-21 06:59:21 字數 2769 閱讀 8418

scanf使用技巧1

456

7894

54

如何將以上數字輸入陣列呢,只需要用下面這段**

scanf

("%d"

,&arr[i]

);

實際上在鍵盤上輸入時,鍵入4《空格》5《空格》6《空格》…

scanf使用技巧2

當我們有有乙個很大的陣列需要輸入時,而每次輸入元素的個數都不一樣,這時該怎麼辦呢?

使用下面這段**即可

int arr[

100]

,i=0;do

while

(getchar()

!='\n'

);

接下來真正的乾貨來啦!!!

3. scanf和getchar進行讀入字元時的區別(注意是讀入字元)

相信小夥伴都知道,scanf(), getchar()都是標準輸入函式,在程式的讀寫中使用非常頻繁,但很多人都認為其非常簡單,進而造成一些雖小而致命的錯誤

程式1

int

main()

程式2

int

main()

該程式的功能很簡單:就是從鍵盤讀入兩個字元,然後列印出這兩個字元的ascii碼值。

實際操作情況:,當從鍵盤輸入乙個字元a後,就列印出了 結果,同時程式結束執行;列印結果為」65 10「。

其實,有點經驗的小夥伴可以看出,10為空格的ascii碼,這究竟是為什麼呢?

分析

首先,我們看一下輸入操作的原理, 程式的輸入都建有乙個緩衝區,即輸入緩衝區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而scanf函式直接從輸入緩衝區中 取資料(注意此時僅是在讀入資料是字元的情況下,讀入字串不樣)。正因為scanf函式是直接從緩衝區取資料的,所以有時候當緩衝區中有殘留資料時,scanf函式會直接取得這些殘留資料而不會請求鍵盤輸入,這就是例子 中為什麼會出現輸入語句失效的原因!

其實這裡的10恰好是回車符!這是因為scanf()和getchar()函式是從輸入流緩衝區中讀取值的,而並非從鍵盤(也就是終端)緩衝區讀取。而讀 取時遇到回車(\n)而結束的,這個\n會一起讀入輸入流緩衝區的,所以第一次接受輸入時取走字元後會留下字元\n,這樣第二次的讀入函式直接從緩衝區中 把\n取走了,顯然讀取成功了,所以不會再從終端讀取!這就是為什麼這個程式只執行了一次輸入操作就結束的原因!

4.scanf和gets讀取字串時的區別(注意是字串)

程式3

int

main()

程式的功能:讀入乙個字串輸出,在讀入乙個字串輸出。可我們會發現輸入的字串中不能出現空格,例如:

測試輸入1:

hello world!

輸出:hello

world!

分析

到此程式執行完畢,不會執行第二次的讀取操作!這個問題的原因跟問題一類似,第一次輸入hello world!後,字串hello world!都會被讀到輸入緩衝區中,而scanf()函式取資料是遇到回車、空格、tab就會停止,也就是第乙個scanf()會取出"hello", 而"world!"還在緩衝區中,這樣第二個scanf會直接取出這些資料,而不會等待從終端輸入。

測試輸入2:

hello[enter]

hello[輸出]

world[enter]

world[輸出]

分析

程式執行了兩次從鍵盤讀入字串,說明第一次輸入結束時的回車符被丟棄!即:scanf()讀取字串會捨棄最後的回車符!

我們再看一下gets()讀取字串的情況:

用scanf來讀取乙個字串時,字串中是不可以出現空格的,一旦出現空格,後面的資料就會捨棄殘留在緩衝區中。其實有另外乙個函式是可以接受空格的,那就是gets(),下面我們看一下這個函式的應用,我們把程式3改動一下:

int

main()

分析

顯然與上乙個程式的執**況不同,這次程式執行了兩次從鍵盤的讀入,而且第乙個字串取了hello world! 接受了空格符,而沒有像上乙個程式那樣分成了兩個字串!所以如果要讀入乙個帶空格符的字串時因該用gets(), 而不宜用scanf()!

總結以下

scanf在輸入字元和字串時情況不同

讀取字元

scanf()以space、enter、tab結束一次輸入,不會捨棄最後的回車符(即回車符會殘留在緩衝區中);

getchar()以enter結束輸入,也不會捨棄最後的回車符;

讀取字串

scanf()以space、enter、tab結束一次輸入

gets()以enter結束輸入(空格不結束),接受空格,會捨棄最後的回車符!

為了避免出現上述問題,必須要清空緩衝區的殘留資料,可以用以下的方法解決:

c語言裡提供了函式清空緩衝區:函式是fflush(stdin);

或者採用一次輸入後接while(getchar()!='\n'){}來清空快取區

5.**大佬部落格

你真的會用GOOGLE嗎

平時很多人用google搜尋引擎搜尋資訊,經常搜尋 成千上萬的網頁,檢視幾頁就沒耐心找下去了。在google上搜尋資訊,不只輸入希望搜尋的片語這麼簡單,這樣是無法得到做好的搜尋結果的。google 為使用者提供了很多基本搜尋語法,熟練的運用google搜尋,將很快的搜到我們需要的結果。短語搜尋 布林...

Markdown 你真的會用嗎?

markdown指南 markdown basics 我有幾張阿里雲幸運券分享給你,用券購買或者公升級阿里雲相應產品會有特惠驚喜哦!把想要買的產品的幸運券都領走吧!快下手,馬上就要搶光了。我常用如 橫線分隔符 超級鏈結 markdown 常遇到的問題 縮排 每段文章我都會習慣性地做首行縮排,但如果直...

你真的會用 RequestParam註解嗎?

訪問 map a a b b 分別返回什麼結果?這樣其實最終走到了org.springframework.web.method.annotation.mapmethodprocessor map?a aa b bb 輸出結果 value map public string testannotatio...