您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言中scanf函數的原樣輸入的坑怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C語言中scanf函數的原樣輸入的坑怎么解決”吧!
scanf函數是C語言里一個輸入函數,但其有很多地方需要注意:
的應該是變量的地址而不是變量本身(即變量名)
例,輸入a,b 兩個整型變量的值的時候,很多初學者會寫成
scanf("%d %d",a,b)
這樣寫是錯的,應該寫成
scanf("%d %d",&a,&b)
例如:
scanf(“%d %d”,&a,&b)
第一個%d是屬于a的,第二個%d是屬于b的
即:
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等之類外的其他所有東西都要原樣輸入,包括空格,逗號
如果scanf("%d %d %d",&a,&b,&c);,那么這時候可以在輸入界面輸入一個再按回車再輸入下一個這樣也是可以的,也可以按照這個格式在一行中進行原樣輸入。
總之中間有空格的就用空格隔開,如果是逗號的就用逗號來隔開,如果什么都沒,即連在一塊的話就按照輸入格式輸入即可。
如果使用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函數的原樣輸入的坑怎么解決”的內容了,經過本文的學習后,相信大家對C語言中scanf函數的原樣輸入的坑怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。