C語言scanf與gets的“愛恨情仇”

在C語言中,能構(gòu)獲取字符串的函數(shù)至少有兩個(gè):scanf( )函數(shù)和gets( )函數(shù)都可用于輸入字符串,兩者雖然都在stdio.h文件中但其功能上有些許不同。主要體現(xiàn)在:scanf不能接受空格、制表符Tab、回車等,而gets能夠接受空格、制表符Tab和回車等;即當(dāng)用scanf()函數(shù)錄入一行字符串,如果字符串中含有空格,那么空格以后的所有字符都不會錄入。而使用gets()函數(shù)則不會出現(xiàn)這種情況,gets會把包含和空格在內(nèi)的所有字符都錄入到程序中。這是scanf和getsd表面上的區(qū)別。殊不知,scanf與gets還有一段“愛恨情仇”。

這周的C語言課后作業(yè)中有一道題涉及到scanf()函數(shù)與gets()函數(shù)連用的情況,先執(zhí)行scanf語句對數(shù)據(jù)進(jìn)行錄入,然后需要執(zhí)行g(shù)ets語句對一行字符串(包含空格)進(jìn)行錄入,可是當(dāng)我運(yùn)行程序時(shí)發(fā)現(xiàn),gets函數(shù)語句沒有被執(zhí)行,但是gets函數(shù)語句后面的語句卻正常執(zhí)行了,頓時(shí)內(nèi)心充滿了疑惑。通過查找資料,最終找到了原因。

原來是在C語言中,當(dāng)使用scanf函數(shù)讀取輸入時(shí),輸入緩沖區(qū)中的換行符會留在緩沖區(qū)中,直到下一次輸入操作。因此,如果在scanf后使用gets函數(shù),gets函數(shù)會讀取緩沖區(qū)中的換行符,從而導(dǎo)致程序出現(xiàn)錯(cuò)誤??梢允褂胓etchar函數(shù)來清除緩沖區(qū)中的換行符,或者使用fgets函數(shù)代替gets函數(shù)來讀取輸入。但我沒有用以上兩種方法去避免這個(gè)bug,而是連用兩個(gè)gets語句,第一個(gè)語句被scanf跳過了,但是第二個(gè)gets語句可以正常執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容