欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決

 更新時(shí)間:2022年07月13日 11:03:03   作者:嵌入式軟件工程師  
這篇文章主要介紹了C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

scanf函數(shù)的原樣輸入的坑及解決

scanf函數(shù)是C語(yǔ)言里一個(gè)輸入函數(shù),但其有很多地方需要注意:

1、scanf函數(shù)格式控制后面輸入

的應(yīng)該是變量的地址而不是變量本身(即變量名)

例,輸入a,b 兩個(gè)整型變量的值的時(shí)候,很多初學(xué)者會(huì)寫(xiě)成

scanf("%d %d",a,b)

這樣寫(xiě)是錯(cuò)的,應(yīng)該寫(xiě)成

scanf("%d %d",&a,&b)

2、scanf函數(shù)的輸入是有順序的

例如:

scanf(“%d %d”,&a,&b)

第一個(gè)%d是屬于a的,第二個(gè)%d是屬于b的

3、最重要的一點(diǎn)就是scanf切記要原樣輸入

即:

scanf(“a = %d,b = %d”,&a,&b);

輸入的是時(shí)候應(yīng)該寫(xiě)成“a = 1,b = 2”,記住逗號(hào)都要原樣輸入。

若是這樣的話(huà);

scanf(“a = %d b = %d”,&a,&b);

這樣的話(huà)就要寫(xiě)成“a = 1 b =2”就連空格都要原樣輸入

總之一句話(huà),除了占位符%d,%f,%lf等之類(lèi)外的其他所有東西都要原樣輸入,包括空格,逗號(hào)

4、還有一個(gè)

如果scanf("%d %d %d",&a,&b,&c);,那么這時(shí)候可以在輸入界面輸入一個(gè)再按回車(chē)再輸入下一個(gè)這樣也是可以的,也可以按照這個(gè)格式在一行中進(jìn)行原樣輸入。

總之中間有空格的就用空格隔開(kāi),如果是逗號(hào)的就用逗號(hào)來(lái)隔開(kāi),如果什么都沒(méi),即連在一塊的話(huà)就按照輸入格式輸入即可。

scanf輸入多個(gè)數(shù)據(jù)出現(xiàn)的問(wèn)題

問(wèn)題引出

如果使用scanf函數(shù)一次輸入多個(gè)數(shù)據(jù),只能是整型和浮點(diǎn)型,如果有char字符型混合輸入,就會(huì)出現(xiàn)問(wèn)題:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-8OJapclT-1607332110976)(Pasted%20Graphic.png)]

圖中可以看到:num3的值并沒(méi)有打印出來(lái),出現(xiàn)這種情況的原因是什么呢???

執(zhí)行原理

讓我們先大概的過(guò)一下里面的執(zhí)行原理:

  • 在執(zhí)行scanf函數(shù)的時(shí)候,會(huì)讓用戶(hù)輸入一個(gè)數(shù)據(jù),數(shù)據(jù)輸入完畢之后,并不是將這個(gè)數(shù)據(jù)直接賦值給變量,而是先將數(shù)據(jù)存儲(chǔ)在緩沖區(qū),輸入的任何數(shù)據(jù)都會(huì)存儲(chǔ)在緩沖區(qū)中
  • 在執(zhí)行scanf函數(shù)的時(shí)候,會(huì)先檢查緩沖區(qū)中是否有數(shù)據(jù),如果緩沖區(qū)中沒(méi)有數(shù)據(jù),那么就會(huì)讓用戶(hù)從鍵盤(pán)輸入,如果緩沖區(qū)中有數(shù)據(jù),直接從緩沖區(qū)中將數(shù)據(jù)拿出來(lái),不會(huì)讓用戶(hù)輸入數(shù)據(jù)
  • 當(dāng)從緩沖區(qū)中拿數(shù)據(jù)的時(shí)候,如果要拿的數(shù)據(jù)的類(lèi)型是整型或者實(shí)型,如果拿到的數(shù)據(jù)的類(lèi)型是空格、回車(chē)、Tab鍵,就會(huì)被自動(dòng)忽略,繼續(xù)往下拿;如果要拿的數(shù)據(jù)是字符型,不會(huì)忽略任何數(shù)據(jù)

程序分析

我們來(lái)分析下面的一段程序:程序中要求用戶(hù)輸入一個(gè)整型數(shù)據(jù)num1,但是這個(gè)時(shí)候我們偏偏輸入兩個(gè)整型數(shù)據(jù)10、20,這個(gè)時(shí)候緩沖區(qū)其實(shí)有四個(gè)數(shù)據(jù):10、空格、20、換行,執(zhí)行第一個(gè)printf后結(jié)果為10,這是我們事先預(yù)料好的;當(dāng)?shù)诙€(gè)scanf執(zhí)行的時(shí)候,程序根本就不會(huì)讓用戶(hù)輸入數(shù)據(jù),因?yàn)榫彌_區(qū)中已經(jīng)有整型數(shù)據(jù)20了【當(dāng)從緩沖區(qū)中拿數(shù)據(jù)的時(shí)候,如果要拿的數(shù)據(jù)的類(lèi)型是整型或者實(shí)型,如果拿到的數(shù)據(jù)的類(lèi)型是空格、回車(chē)、Tab鍵,就會(huì)被自動(dòng)忽略,繼續(xù)往下拿】,所以最終程序會(huì)直接打印出num2=20

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-uSu3YfSK-1607332110978)(Pasted%20Graphic%201.png)]

讓我們?cè)倩仡^看第一個(gè)程序:為什么num3的值打印出來(lái)的結(jié)果為空???

執(zhí)行完第11行程序以后,緩沖區(qū)中的數(shù)據(jù)為10、空格、2.5、空格、a、換行;打印num1、num2的值的時(shí)候,因?yàn)槭钦突蛘吒↑c(diǎn)型,程序會(huì)自動(dòng)忽略空格和換行,所以輸出結(jié)果為num1=10,num2=2.500000;但是num3是一個(gè)字符型的數(shù)據(jù),程序并不會(huì)忽略任何的數(shù)據(jù),最后打印出來(lái)的結(jié)果為num3= ;【這里打印出來(lái)了一個(gè)空格,并不是空】

解決方案

那這個(gè)時(shí)候就有問(wèn)題了,如果scanf輸入多個(gè)數(shù)據(jù)中包含字符型數(shù)據(jù)時(shí),我就是想要輸出來(lái)字符型數(shù)據(jù),該怎么做呢???

解決方案:通過(guò)rewind(stdin);這行代碼把緩沖區(qū)中的數(shù)據(jù)全部清空,這個(gè)時(shí)候緩沖區(qū)中沒(méi)有任何數(shù)據(jù)了

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-9UNqDCfl-1607332110979)(Pasted%20Graphic%202.png)]

寫(xiě)C代碼時(shí),如果遇到整型、浮點(diǎn)型、字符型同時(shí)出現(xiàn)在scanf函數(shù)中的時(shí)候,要十分注意緩沖區(qū)中數(shù)據(jù)的情況??!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++編寫(xiě)實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    C++編寫(xiě)實(shí)現(xiàn)飛機(jī)大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了C++編寫(xiě)實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于C++11的threadpool線(xiàn)程池(簡(jiǎn)潔且可以帶任意多的參數(shù))

    基于C++11的threadpool線(xiàn)程池(簡(jiǎn)潔且可以帶任意多的參數(shù))

    C++11 加入了線(xiàn)程庫(kù),從此告別了標(biāo)準(zhǔn)庫(kù)不支持并發(fā)的歷史。然而 c++ 對(duì)于多線(xiàn)程的支持還是比較低級(jí),稍微高級(jí)一點(diǎn)的用法都需要自己去實(shí)現(xiàn),譬如線(xiàn)程池、信號(hào)量等
    2019-04-04
  • C++ Primer注解之引用和指針

    C++ Primer注解之引用和指針

    這篇文章主要介紹了C++ Primer注解之引用和指針的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Qt生成隨機(jī)數(shù)的方法

    Qt生成隨機(jī)數(shù)的方法

    本文主要介紹了Qt生成隨機(jī)數(shù),生成隨機(jī)數(shù)主要用到了函數(shù)qsrand和qrand,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c++野指針的原理以及避免方法

    c++野指針的原理以及避免方法

    這篇文章主要介紹了c++野指針的原理以及避免方法,幫助大家更好的學(xué)習(xí)和理解c++,感興趣的朋友可以了解下
    2020-08-08
  • 在1個(gè)Matlab m文件中定義多個(gè)函數(shù)直接運(yùn)行的操作方法

    在1個(gè)Matlab m文件中定義多個(gè)函數(shù)直接運(yùn)行的操作方法

    這篇文章主要介紹了如何在1個(gè)Matlab m文件中定義多個(gè)函數(shù)直接運(yùn)行,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • C語(yǔ)言之函數(shù)返回值與參數(shù)傳遞案例教程

    C語(yǔ)言之函數(shù)返回值與參數(shù)傳遞案例教程

    這篇文章主要介紹了C語(yǔ)言之函數(shù)返回值與參數(shù)傳遞案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)彈跳小球

    C語(yǔ)言實(shí)現(xiàn)彈跳小球

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)彈跳小球,設(shè)置了小球分?jǐn)?shù)及過(guò)關(guān)難度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++實(shí)現(xiàn)簡(jiǎn)易的彈球小游戲

    C++實(shí)現(xiàn)簡(jiǎn)易的彈球小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易的彈球小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++設(shè)計(jì)模式之中介者模式

    C++設(shè)計(jì)模式之中介者模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之中介者模式,本文講解了什么是中介者模式、中介者模式的使用場(chǎng)合、中介者模式的優(yōu)缺點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2014-10-10

最新評(píng)論