首頁 > 軟體

C語言中scanf函數的原樣輸入的坑及解決

2022-07-13 14:02:24

scanf函數的原樣輸入的坑及解決

scanf函數是C語言裡一個輸入函數,但其有很多地方需要注意:

1、scanf函數格式控制後面輸入

的應該是變數的地址而不是變數本身(即變數名)

例,輸入a,b 兩個整型變數的值的時候,很多初學者會寫成

scanf("%d %d",a,b)

這樣寫是錯的,應該寫成

scanf("%d %d",&a,&b)

2、scanf函數的輸入是有順序的

例如:

scanf(「%d %d」,&a,&b)

第一個%d是屬於a的,第二個%d是屬於b的

3、最重要的一點就是scanf切記要原樣輸入

即:

scanf(「a = %d,b = %d」,&a,&b);

輸入的是時候應該寫成“a = 1,b = 2”,記住逗號都要原樣輸入。

若是這樣的話;

scanf(「a = %d b = %d」,&a,&b);

這樣的話就要寫成“a = 1 b =2”就連空格都要原樣輸入

總之一句話,除了預留位置%d,%f,%lf等之類外的其他所有東西都要原樣輸入,包括空格,逗號

4、還有一個

如果scanf("%d %d %d",&a,&b,&c);,那麼這時候可以在輸入介面輸入一個再按回車再輸入下一個這樣也是可以的,也可以按照這個格式在一行中進行原樣輸入。

總之中間有空格的就用空格隔開,如果是逗號的就用逗號來隔開,如果什麼都沒,即連在一塊的話就按照輸入格式輸入即可。

scanf輸入多個資料出現的問題

問題引出

如果使用scanf函數一次輸入多個資料,只能是整型和浮點型,如果有char字元型混合輸入,就會出現問題:

圖中可以看到:num3的值並沒有列印出來,出現這種情況的原因是什麼呢???

執行原理

讓我們先大概的過一下里面的執行原理:

  • 在執行scanf函數的時候,會讓使用者輸入一個資料,資料輸入完畢之後,並不是將這個資料直接賦值給變數,而是先將資料儲存在緩衝區,輸入的任何資料都會儲存在緩衝區中
  • 在執行scanf函數的時候,會先檢查緩衝區中是否有資料,如果緩衝區中沒有資料,那麼就會讓使用者從鍵盤輸入,如果緩衝區中有資料,直接從緩衝區中將資料拿出來,不會讓使用者輸入資料
  • 當從緩衝區中拿資料的時候,如果要拿的資料的型別是整型或者實型,如果拿到的資料的型別是空格、回車、Tab鍵,就會被自動忽略,繼續往下拿;如果要拿的資料是字元型,不會忽略任何資料

程式分析

我們來分析下面的一段程式:程式中要求使用者輸入一個整型資料num1,但是這個時候我們偏偏輸入兩個整型資料10、20,這個時候緩衝區其實有四個資料:10、空格、20、換行,執行第一個printf後結果為10,這是我們事先預料好的;當第二個scanf執行的時候,程式根本就不會讓使用者輸入資料,因為緩衝區中已經有整型資料20了【當從緩衝區中拿資料的時候,如果要拿的資料的型別是整型或者實型,如果拿到的資料的型別是空格、回車、Tab鍵,就會被自動忽略,繼續往下拿】,所以最終程式會直接列印出num2=20

讓我們再回頭看第一個程式:為什麼num3的值列印出來的結果為空???

執行完第11行程式以後,緩衝區中的資料為10、空格、2.5、空格、a、換行;列印num1、num2的值的時候,因為是整型或者浮點型,程式會自動忽略空格和換行,所以輸出結果為num1=10,num2=2.500000;但是num3是一個字元型的資料,程式並不會忽略任何的資料,最後列印出來的結果為num3= ;【這裡列印出來了一個空格,並不是空】

解決方案

那這個時候就有問題了,如果scanf輸入多個資料中包含字元型資料時,我就是想要輸出來字元型資料,該怎麼做呢???

解決方案:通過rewind(stdin);這行程式碼把緩衝區中的資料全部清空,這個時候緩衝區中沒有任何資料了

寫C程式碼時,如果遇到整型、浮點型、字元型同時出現在scanf函數中的時候,要十分注意緩衝區中資料的情況!!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com