日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言scanf()函数的原理

發(fā)布時(shí)間:2025/3/20 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言scanf()函数的原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

scanf()函數(shù)的原理

想象輸入設(shè)備(鍵盤)連接著一個(gè)叫“緩沖”的東西,把緩沖認(rèn)為是一個(gè)字符數(shù)組。

當(dāng)你的程序執(zhí)行到scanf時(shí),會(huì)從你的緩沖區(qū)讀東西,如果緩沖區(qū)是空的,就阻塞住,等待你從鍵盤輸入。

現(xiàn)在假設(shè)你的緩沖區(qū)里有:abcd\n1234\n (其中\(zhòng)n是回車符)執(zhí)行:scanf("%s",name);的時(shí)候,由于scanf是讀數(shù)據(jù)直到看見空白符(空白符:指空格符、制表符、回車符)就停止的輸入函數(shù)。所以執(zhí)行后,把a(bǔ)bcd存到了name中。緩沖區(qū)于是變成了 : \n1234\n

接下來的執(zhí)行就有問題了,如果遇到了:scanf("%d",&number);怎么辦?因?yàn)橛龅搅嘶剀嚪?#xff0c;它并不是一個(gè)數(shù)字,所以scanf還有一個(gè)特性,就是忽略先導(dǎo)的空白符。不管是有幾百個(gè)回車也好,幾萬個(gè)空格也罷,只要它們連續(xù)地出現(xiàn)在緩沖區(qū)的開頭,就統(tǒng)統(tǒng)忽略他們。然后再讀有意義的字符。于是1234被讀入number。

回到剛剛,當(dāng)緩沖區(qū)還是:\n1234\n的時(shí)候,如果遇到了:scanf("%c",&sex);應(yīng)該怎么辦呢?你說,那好辦呀,不是說了忽略前導(dǎo)空白符嗎?跳過回車讀’1’呀!想法是好的,可這只針對你的程序這一種情況。如果我編寫的程序就是統(tǒng)計(jì)用戶輸入了多少個(gè)回車呢?所以對scanf來講跳過前導(dǎo)空白符有個(gè)例外,當(dāng)參數(shù)是%c的時(shí)候,就把緩沖區(qū)的第一個(gè)字符返回回去,不管是什么

這樣的設(shè)計(jì)就有個(gè)問題,scanf對不同的參數(shù)表現(xiàn)出來的特性不一樣。得承認(rèn),這是個(gè)缺陷,但不是說這樣不好。

這樣的設(shè)計(jì)至少把發(fā)現(xiàn)所有字符的機(jī)會(huì)交給了用戶,設(shè)計(jì)者這樣想:如果程序員使用了scanf("%c",…),那他就有必要知道這函數(shù)能把回車符讀出來,至于程序員對回車符感不感興趣,那就看他了,不感興趣的話,程序員也一定知道該怎么處理。回到你的程序里。

當(dāng)執(zhí)行scanf("%s",name)的時(shí)候,要求你從鍵盤輸入,于是你輸入了"abc",然后“回車”。緩沖區(qū)里自然而然地是:abc\n scanf把a(bǔ)bc拿走了,留下了\n,緩沖區(qū)里現(xiàn)在就剩下\n于是,下一個(gè)scanf ("%c",&sex); 想當(dāng)然地讀取了\n

  • 關(guān)于scanf忽略前導(dǎo)空白符這一點(diǎn),可以這樣驗(yàn)證
    寫個(gè)程序,用scanf()讀數(shù)據(jù),只要不是%c就行。然后輸入的時(shí)候,隨便輸入回車、空格、制表符,然后“回車”確認(rèn)。會(huì)發(fā)現(xiàn)程序依然提示等待你輸入。就是因?yàn)樗雎缘羲星皩?dǎo)空白符之后發(fā)現(xiàn)緩沖區(qū)是空的!于是乖乖地阻塞住,等待你輸入。

  • 關(guān)于scanf是直到看見空白符結(jié)束讀取這一點(diǎn),如果你是初學(xué)C的話,那么很快你就會(huì)遇到另一個(gè)函數(shù),叫g(shù)ets()。
    程序里如果我們想一次讀入一個(gè)英文句子:I am a student.如果你用scanf讀的話,只能讀出"I",想讀出后面的東西要不斷調(diào)scanf。此時(shí)需要用gets,這個(gè)函數(shù)不管是什么一律讀進(jìn)來,直到遇到回車符才停下。總之,各有各的用途,全都熟悉之后,才能在恰當(dāng)?shù)臅r(shí)候恰當(dāng)?shù)厥褂谩?br /> 以上轉(zhuǎn)自:http://blog.pfan.cn/katwood/53198.html
    最后感謝大牛的分享。

總結(jié)

以上是生活随笔為你收集整理的c语言scanf()函数的原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。