一、scanf 在緩沖區(qū)獲取數(shù)據(jù)的一些問題
創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、微信小程序定制開發(fā)、公眾號商城、等建站開發(fā),創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢。1、scanf 不會拿緩沖區(qū)里的
2、scanf 只會拿空格前的數(shù)據(jù)
給剛?cè)腴T的兄弟推薦一個新手也能上手的刷題網(wǎng)站:
LeetCode: https://leetcode-cn.com/problemset/all/
鍵盤輸入的信息暫存在緩沖區(qū),scanf 在緩沖區(qū)中獲取信息(再存到相應(yīng)變量中)
1、scanf 不會拿緩沖區(qū)里的但是當(dāng)我們輸入完一串?dāng)?shù)據(jù)(如123456)后會按下回車鍵,在緩沖區(qū)就會變成:123456\n ,按下回車鍵的與此同時 scanf 也開始從緩沖區(qū)中獲取數(shù)據(jù)(拿數(shù)據(jù)),待 scanf 拿完數(shù)據(jù)后,緩沖區(qū)會剩下 \n 。先了解此一原則
2、scanf 只會拿空格前的數(shù)據(jù)etc. char arr[20]={0};
scanf("%s",arr);
這時運(yùn)行起來,我們在控制臺輸入:123456 abc //注意有空格
回車后緩沖區(qū)立馬出現(xiàn) :123456 abc\n ,隨即 scanf 從中獲取數(shù)據(jù)(拿數(shù))
剩下的是: abc\n //左側(cè) abc\n 前的下劃線表示空格
二、了解 getchar 在緩沖區(qū)獲取數(shù)據(jù)的一些問題getchar ( ) 會直接從緩沖區(qū)中獲取數(shù)據(jù),并且只拿一個字符,這是緩沖區(qū)里有數(shù)據(jù)的情況;如果緩沖區(qū)中沒數(shù)據(jù),getchar 就會等待
第二點雖然少,但是要求理解(這當(dāng)然不是理由)
三、所以當(dāng) scanf 和 getchar 用在一起會出現(xiàn)一些易出錯的問題當(dāng) scanf 剛?cè)⊥曛岛?,后面沒清空緩沖區(qū)直接用 getchar ( ) 獲取我們新輸入的字符,這時 getchar 獲取了緩沖區(qū)原有的一個字符后不再獲取,獲取的不是我們輸入的字符
etc. (沒有清空緩沖區(qū)的錯誤例子)
char arr [20] = {0};
printf("輸入密碼:")
scanf("%s", arr);
printf("確認(rèn)密碼(T / F):")
int a = getchar ();
if (a = ' T ')
{
printf("密碼正確");
}
else
{
printf("密碼錯誤");
}
運(yùn)行起來發(fā)現(xiàn)不管輸入什么都直接是密碼錯誤:
四、解決辦法既然是沒有清空緩沖區(qū)而出現(xiàn)的問題,那就清空緩沖區(qū)
用 getchar () 來取雖然一個 getchar 只取一個,那就用 while 讓它一直取到空位置
在 scanf 取完數(shù)后加入一個 while 循環(huán):
int empty = 0; ??????????????????????????????????//先定義一個常量
while( ( empty=getchar() ) != ' \n ' )
{
getchar(); ????????????????????????????????????????//這樣這里的 getchar 在緩沖區(qū)取的數(shù)就會被忽略
} ??????????????????????????????????????????????????????//也不儲存在empty中(被扔掉)
運(yùn)行結(jié)果:
獻(xiàn)給新手的其他文章目錄(希望對你有所幫助)
一、【C語言】初學(xué)者寫基礎(chǔ)代碼的基本步驟_Meiyourou.c的博客-博客_如何開始寫代碼二、關(guān)于scanf,局部與全局變量的理解_Meiyourou.c的博客-博客三、【C語言】生命周期和作用域_Meiyourou.c的博客-博客_c語言生命周期四、【C語言】字符串及求字符串的長度_Meiyourou.c的博客-博客五、【C語言】條件操作符,逗號操作符,操作符 ( ) 、[ ]_Meiyourou.c的博客-博客六、【C語言】操作符 ~ ,二進(jìn)制位按位取反_Meiyourou.c的博客-博客七、【C語言】static_Meiyourou.c的博客-博客八、【C語言】轉(zhuǎn)義字符_Meiyourou.c的博客-博客九、【C語言】if 語句的相關(guān)內(nèi)容_Meiyourou.c的博客-博客十、【C語言】 switch 分支語句_Meiyourou.c的博客-博客
最后的最后,送大家一句話:
諸位不免摘一朵野花,更比夕陽......
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧