C語言scanf函數(shù)的使用心得
在今天的c語言學(xué)習(xí)中,在對(duì)scanf函數(shù)的使用上,發(fā)現(xiàn)了一個(gè)知識(shí)盲區(qū),在此加以記錄,以便日后查看。
scanf函數(shù)屬于阻塞型函數(shù),倘若你輸入的數(shù)據(jù)個(gè)數(shù)不滿足要求,則會(huì)一直阻塞,直到鍵盤輸入足夠的數(shù)據(jù)為止。用戶通過鍵盤輸入的內(nèi)容會(huì)被存儲(chǔ)在鍵盤輸入緩沖區(qū),scanf函數(shù)會(huì)根據(jù)自身格式控制字符(例如%d、%c等)取出鍵盤輸入緩沖區(qū)中符合要求的數(shù)據(jù),并將對(duì)應(yīng)的為止置零。倘若讀取到不符合要求的數(shù)據(jù),會(huì)將其保留原樣。只要輸入緩沖區(qū)中還有數(shù)據(jù),scanf函數(shù)就不會(huì)要求鍵盤繼續(xù)輸入數(shù)據(jù)。例如如下代碼:
當(dāng)我們輸入五個(gè)整形數(shù)據(jù)時(shí),程序能夠正常輸出鍵盤輸入的數(shù)據(jù)。但是當(dāng)我們輸入:
12 b 31 56 b,對(duì)應(yīng)的輸出為:
返回值為1
返回值為0
返回值為0
返回值為0
返回值為0
您剛剛輸入的是:12
您剛剛輸入的是:0
您剛剛輸入的是:0
您剛剛輸入的是:0
您剛剛輸入的是:0
,可以看出,輸出結(jié)果是不對(duì)的,這是什么原因呢?由輸出結(jié)果我們可以看出,程序在將輸入的第一個(gè)數(shù)據(jù)成功賦值后,后面全部賦值失敗。這是因?yàn)椋?dāng)scanf函數(shù)成功讀取第一個(gè)數(shù)據(jù)后,開始去讀第二個(gè)數(shù)據(jù),發(fā)現(xiàn)第二個(gè)數(shù)據(jù)b并不符合十進(jìn)制數(shù)的要求,便將其放回原位,scanf函數(shù)返回0,提示讀取失敗。然后后面執(zhí)行的scanf函數(shù)再一次掃描鍵盤輸入緩沖區(qū),并自動(dòng)忽略空格,再一次來到了b這里,又發(fā)現(xiàn)b不是十進(jìn)制數(shù)據(jù),返回0告警。后續(xù)執(zhí)行scanf函數(shù),只要其格式控制字符不改變,這里的b注定就會(huì)是scanf函數(shù)的傷心嶺,難以逾越,也就導(dǎo)致了除以個(gè)數(shù)據(jù)外,其他數(shù)據(jù)均讀取失敗。
但是,當(dāng)你輸入12 - + 65 78時(shí),結(jié)果卻是:
返回值為1
返回值為0
返回值為0
返回值為1
返回值為1
您剛剛輸入的是:12
您剛剛輸入的是:0
您剛剛輸入的是:0
您剛剛輸入的是:65
您剛剛輸入的是:78
這里和上一次輸入的數(shù)據(jù)有什么不同呢?區(qū)別就是這次輸入的數(shù)據(jù)可以使十進(jìn)制數(shù)或者是十進(jìn)制數(shù)組成的一部分,主要就是-、+,這兩個(gè)符號(hào),其可以是有符號(hào)十進(jìn)制數(shù)的組成部分,例如-10,或者+10,因此這里的scanf函數(shù)能夠成功將其取走,而不會(huì)像上一個(gè)例子那樣,導(dǎo)致后續(xù)執(zhí)行的scanf函數(shù)讀取數(shù)據(jù)失敗。
在scanf函數(shù)的格式控制字符中,只有%c會(huì)將空格一并讀取并輸出,其他控制字符也會(huì)讀取空格,但均會(huì)自動(dòng)忽略空格、tab和回車鍵。scanf讀取數(shù)據(jù)時(shí),會(huì)從遇到的第一個(gè)非空格字符開始,到遇到的第一個(gè)空格結(jié)束,將兩者之間的數(shù)據(jù)視為一個(gè)按規(guī)定格式讀取到的數(shù)據(jù),并存儲(chǔ)在傳入的內(nèi)存地址中。