C語言中scanf函數(shù)的原樣輸入的坑及解決
scanf函數(shù)的原樣輸入的坑及解決
scanf函數(shù)是C語言里一個輸入函數(shù),但其有很多地方需要注意:
1、scanf函數(shù)格式控制后面輸入
的應(yīng)該是變量的地址而不是變量本身(即變量名)
例,輸入a,b 兩個整型變量的值的時候,很多初學(xué)者會寫成
scanf("%d %d",a,b)
這樣寫是錯的,應(yīng)該寫成
scanf("%d %d",&a,&b)
2、scanf函數(shù)的輸入是有順序的
例如:
scanf(“%d %d”,&a,&b)
第一個%d是屬于a的,第二個%d是屬于b的
3、最重要的一點就是scanf切記要原樣輸入
即:
scanf(“a = %d,b = %d”,&a,&b);
輸入的是時候應(yīng)該寫成“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輸入多個數(shù)據(jù)出現(xiàn)的問題
問題引出
如果使用scanf函數(shù)一次輸入多個數(shù)據(jù),只能是整型和浮點型,如果有char字符型混合輸入,就會出現(xiàn)問題:
圖中可以看到:num3的值并沒有打印出來,出現(xiàn)這種情況的原因是什么呢???
執(zhí)行原理
讓我們先大概的過一下里面的執(zhí)行原理:
- 在執(zhí)行scanf函數(shù)的時候,會讓用戶輸入一個數(shù)據(jù),數(shù)據(jù)輸入完畢之后,并不是將這個數(shù)據(jù)直接賦值給變量,而是先將數(shù)據(jù)存儲在緩沖區(qū),輸入的任何數(shù)據(jù)都會存儲在緩沖區(qū)中
- 在執(zhí)行scanf函數(shù)的時候,會先檢查緩沖區(qū)中是否有數(shù)據(jù),如果緩沖區(qū)中沒有數(shù)據(jù),那么就會讓用戶從鍵盤輸入,如果緩沖區(qū)中有數(shù)據(jù),直接從緩沖區(qū)中將數(shù)據(jù)拿出來,不會讓用戶輸入數(shù)據(jù)
- 當(dāng)從緩沖區(qū)中拿數(shù)據(jù)的時候,如果要拿的數(shù)據(jù)的類型是整型或者實型,如果拿到的數(shù)據(jù)的類型是空格、回車、Tab鍵,就會被自動忽略,繼續(xù)往下拿;如果要拿的數(shù)據(jù)是字符型,不會忽略任何數(shù)據(jù)
程序分析
我們來分析下面的一段程序:程序中要求用戶輸入一個整型數(shù)據(jù)num1,但是這個時候我們偏偏輸入兩個整型數(shù)據(jù)10、20,這個時候緩沖區(qū)其實有四個數(shù)據(jù):10、空格、20、換行,執(zhí)行第一個printf后結(jié)果為10,這是我們事先預(yù)料好的;當(dāng)?shù)诙€scanf執(zhí)行的時候,程序根本就不會讓用戶輸入數(shù)據(jù),因為緩沖區(qū)中已經(jīng)有整型數(shù)據(jù)20了【當(dāng)從緩沖區(qū)中拿數(shù)據(jù)的時候,如果要拿的數(shù)據(jù)的類型是整型或者實型,如果拿到的數(shù)據(jù)的類型是空格、回車、Tab鍵,就會被自動忽略,繼續(xù)往下拿】,所以最終程序會直接打印出num2=20
讓我們再回頭看第一個程序:為什么num3的值打印出來的結(jié)果為空???
執(zhí)行完第11行程序以后,緩沖區(qū)中的數(shù)據(jù)為10、空格、2.5、空格、a、換行;打印num1、num2的值的時候,因為是整型或者浮點型,程序會自動忽略空格和換行,所以輸出結(jié)果為num1=10,num2=2.500000;但是num3是一個字符型的數(shù)據(jù),程序并不會忽略任何的數(shù)據(jù),最后打印出來的結(jié)果為num3= ;【這里打印出來了一個空格,并不是空】
解決方案
那這個時候就有問題了,如果scanf輸入多個數(shù)據(jù)中包含字符型數(shù)據(jù)時,我就是想要輸出來字符型數(shù)據(jù),該怎么做呢???
解決方案:通過rewind(stdin);這行代碼把緩沖區(qū)中的數(shù)據(jù)全部清空,這個時候緩沖區(qū)中沒有任何數(shù)據(jù)了
寫C代碼時,如果遇到整型、浮點型、字符型同時出現(xiàn)在scanf函數(shù)中的時候,要十分注意緩沖區(qū)中數(shù)據(jù)的情況??!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于C++11的threadpool線程池(簡潔且可以帶任意多的參數(shù))
C++11 加入了線程庫,從此告別了標準庫不支持并發(fā)的歷史。然而 c++ 對于多線程的支持還是比較低級,稍微高級一點的用法都需要自己去實現(xiàn),譬如線程池、信號量等2019-04-04在1個Matlab m文件中定義多個函數(shù)直接運行的操作方法
這篇文章主要介紹了如何在1個Matlab m文件中定義多個函數(shù)直接運行,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12