最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++字符串輸入緩沖區(qū)機(jī)制詳解

 更新時(shí)間:2021年10月28日 15:50:20   作者:srymakerTT  
緩沖區(qū)是用來存放流中的數(shù)據(jù),本文詳細(xì)的介紹了C++字符串輸入緩沖區(qū)機(jī)制,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、緩沖定義

1.緩沖定義

緩沖是在兩種不同速度設(shè)備之間傳輸信息時(shí)平滑傳輸過程的常用手段。

2.為什么引入緩沖區(qū)

操作系統(tǒng)這門課有明確的說明緩沖的作用,是為了解決高速設(shè)備和低速設(shè)備之間速度不匹配的問題,直接舉個(gè)書上的CPU和打印機(jī)的例子:

首先我們要用打印機(jī)打印一篇文章肯定要經(jīng)過CPU處理然后給到打印機(jī)打印文章,但是CPU處理1000個(gè)字節(jié)的文字一眨眼的事情,但是打印機(jī)可能需要若干秒,總不可能讓CPU處理一個(gè)數(shù)據(jù)給打印機(jī)一個(gè)數(shù)據(jù)這樣子等著運(yùn)行,這就引入了緩沖區(qū),CPU處理完數(shù)據(jù)存入緩沖區(qū),打印機(jī)直接從緩沖區(qū)提取已經(jīng)處理好的數(shù)據(jù),這樣子就解決了高速設(shè)備(CPU)和低速設(shè)備(打印機(jī))處理速度不匹配的問題。

二、scanf,cin輸入緩沖區(qū)

1.scanf和cin的緩沖類型

scanf和cin的緩沖類型為行緩沖,行緩沖的的特點(diǎn)是在輸入數(shù)據(jù)只要沒有碰到換行符(回車)就將數(shù)據(jù)存入輸入緩沖區(qū),當(dāng)碰到換行符之后就將緩沖區(qū)中的數(shù)據(jù)取出使用。

2.scanf和cin的緩沖機(jī)制

scanf和cin輸入數(shù)據(jù)緩沖機(jī)制基本一致,在讀入一個(gè)數(shù)據(jù)時(shí)直到回車之前他都會(huì)存儲(chǔ)在輸入緩沖區(qū)中,直到碰到回車才會(huì)將數(shù)據(jù)從輸入緩沖區(qū)中取出供變量使用,但是緩沖區(qū)中的換行符會(huì)被留在輸入緩沖區(qū)中。

3.cin.getline和cin.get

cin.get讀取字符串直到讀取到回車為止,但是也會(huì)將回車留在緩沖區(qū)。

cin.getline讀取字符串直到讀取到回車為止,但是不會(huì)講回車留在緩沖區(qū)。

4.scanf和cin輸入

①cin和scanf讀取一個(gè)字符的區(qū)別

	char c;
	cin>>c;//cin讀取字符的時(shí)候不會(huì)讀入空格、回車以及制表符,如果緩沖區(qū)開頭是換行符或者制表符會(huì)被忽略并清除
	scanf("%c",&c);//scanf讀取字符的時(shí)候不會(huì)管你是什么字符直接讀進(jìn)來

②cin和scanf在讀取緩沖區(qū)中的數(shù)字、字符串、浮點(diǎn)型的時(shí)候不會(huì)將開頭的空格、換行符或者制表符當(dāng)作數(shù)據(jù)讀入,如果碰到了他們會(huì)將它們忽略并清除。需要注意cin.get和cin.getline不會(huì)將開頭的空格、換行符或者制表符忽略并刪除。

5.可能遇到的問題

①在用cin或者scanf讀取一個(gè)字符串之后scanf再讀取一個(gè)字符,發(fā)現(xiàn)讀取的字符沒辦法輸入而且輸出了一個(gè)回車??慈缦麓a:

	char name[20];
    char c;
    cin>>name;
    cout<<name<<endl;
    scanf("%c",&c);
    cout<<"---"<<int(c)<<endl;

結(jié)果如下截圖:

在這里插入圖片描述

當(dāng)我們輸入name為123的時(shí)候程序就結(jié)束了輸出c的值為10,在ASCII碼編碼中10對(duì)應(yīng)的是換行符,為什么會(huì)出現(xiàn)上述這種情況呢?因?yàn)閏in輸入完之后將回車保留在了緩沖區(qū)中,而scanf("%c",&c)輸入字符并不會(huì)判斷是空格還是回車,直接將緩沖區(qū)中的回車拿了出來給了字符變量c。

②用cin.getline輸入字符串之后再用scanf讀取一個(gè)字符就和上面不一樣了。看如下代碼:

	char name[20];
    char c;
    cin.getline(name,20);
    cout<<name<<endl;
    scanf("%c",&c);
    cout<<"---"<<int(c)<<endl;

結(jié)果如下截圖:

在這里插入圖片描述

結(jié)果不同的原因是因?yàn)閟canf,cin,cin.get在行緩沖取出數(shù)據(jù)之后會(huì)將換行符留在緩沖區(qū)中,然后再用scanf讀入一個(gè)字符發(fā)現(xiàn)緩沖區(qū)并不為空就從緩沖區(qū)中將數(shù)據(jù)拿出來,而cin.getline會(huì)將緩沖區(qū)中的換行符也清除,所以不會(huì)有①這種情況出現(xiàn)。

③讀入一個(gè)字符串之后后面的cin.get()一直無法讀取數(shù)據(jù),看如下代碼:

	char name[20];
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;
    cin.get(name,20);
    cout<<"--"<<name<<endl;

結(jié)果如下截圖:

在這里插入圖片描述

可以看到用第一個(gè)cin.get輸入了數(shù)據(jù)之后后面的cin.get都無效了,這是因?yàn)閏in.get從緩沖區(qū)中讀取到換行符就結(jié)束并將換行符保留在緩沖區(qū)中,接下來的cin.get一直在緩沖區(qū)中碰到換行符就一直沒有實(shí)際數(shù)據(jù)輸入。

④整形和字符串混合輸入

當(dāng)先輸入一個(gè)整形再用cin.getline輸入字符串會(huì)發(fā)現(xiàn)沒有經(jīng)歷輸入字符串的過程,測試如下代碼:

	char name[20];
    int a;
    cin>>a;
    cout<<a<<endl;
    cin.getline(name,20);
    cout<<"---"<<name<<endl;
    cout<<"end"<<endl;

結(jié)果如下:

在這里插入圖片描述

根據(jù)上面的緩沖原理比較容易理解,cin輸入一個(gè)整形后會(huì)在緩沖區(qū)中留下一個(gè)換行符,因?yàn)榫彌_區(qū)中有換行符剩余,cin.getline從緩沖區(qū)中取出數(shù)據(jù)發(fā)現(xiàn)正好是換行符,那么就默認(rèn)字符串輸入完了,并將換行符從緩沖區(qū)中去掉,所以造成了上面的局面。

清除緩沖區(qū)

上面講的問題基本上都是因?yàn)榫彌_區(qū)中剩余的數(shù)據(jù)造成的,那么只需要有方法清除緩沖區(qū)就行了,可以用getchar(),cin.get()讀取緩沖區(qū)中多的換行符。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)

    C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要介紹了C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++設(shè)計(jì)模式之工廠方法模式的實(shí)現(xiàn)及優(yōu)缺點(diǎn)

    C++設(shè)計(jì)模式之工廠方法模式的實(shí)現(xiàn)及優(yōu)缺點(diǎn)

    工廠方法模式是一個(gè)創(chuàng)建型設(shè)計(jì)模式,通過定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類決定實(shí)例化哪一個(gè)工廠類,這篇文章主要給大家介紹了關(guān)于C++設(shè)計(jì)模式之工廠方法模式的實(shí)現(xiàn)及優(yōu)缺點(diǎn),需要的朋友可以參考下
    2021-06-06
  • VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例

    VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例

    這篇文章主要介紹了VC實(shí)現(xiàn)的病毒專殺工具完整實(shí)例,詳細(xì)講述了針對(duì)病毒的進(jìn)程終止、刪除文件及回復(fù)注冊表與啟動(dòng)項(xiàng)等,同時(shí)介紹了與之相關(guān)的系統(tǒng)函數(shù),非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序

    C語言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序

    這篇文章主要介紹了C語言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++中std::ios_base::floatfield報(bào)錯(cuò)已解決

    C++中std::ios_base::floatfield報(bào)錯(cuò)已解決

    在C++編程中,設(shè)置浮點(diǎn)數(shù)輸出格式時(shí)可能遇到std::ios_base::floatfield錯(cuò)誤,解決方法包括使用正確的格式化標(biāo)志組合,避免沖突的格式化設(shè)置,以及檢查流狀態(tài)標(biāo)志是否正確,通過這些方法可以有效避免浮點(diǎn)數(shù)格式化錯(cuò)誤,并確保輸出精確
    2024-09-09
  • C語言實(shí)現(xiàn)文件讀寫

    C語言實(shí)現(xiàn)文件讀寫

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)文件讀寫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言函數(shù)指針詳解

    C語言函數(shù)指針詳解

    大家好,本篇文章主要講的是C語言函數(shù)指針詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Visual C++中MFC消息的分類

    Visual C++中MFC消息的分類

    標(biāo)準(zhǔn)(窗口)消息:窗口消息一般與窗口內(nèi)部運(yùn)作有關(guān),如創(chuàng)建窗口,繪制窗口,銷毀窗口,通常,消息是從系統(tǒng)發(fā)到窗口,或從窗口發(fā)到系統(tǒng)
    2012-11-11
  • c++智能指針的超詳細(xì)講解

    c++智能指針的超詳細(xì)講解

    c++程序設(shè)計(jì)中經(jīng)常會(huì)用堆內(nèi)存,程序員要自己管理內(nèi)存的申請和釋放,使用原始指針,容易造成堆內(nèi)存泄漏(忘記釋放),二次釋放,使用智能指針能更好的管理堆內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于c++智能指針的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • C++ 中assert()函數(shù)用法總結(jié)

    C++ 中assert()函數(shù)用法總結(jié)

    這篇文章主要介紹了C++ 中assert()函數(shù)用法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評(píng)論

唐海县| 留坝县| 都江堰市| 来凤县| 盖州市| 阳山县| 昆山市| 泰顺县| 遂昌县| 五大连池市| 额尔古纳市| 盖州市| 孟津县| 巴中市| 达州市| 汝州市| 调兵山市| 集安市| 鹰潭市| 杭州市| 伊春市| 迁西县| 镇远县| 永靖县| 富宁县| 赤壁市| 凉城县| 上林县| 建平县| 张家口市| 宜良县| 盱眙县| 曲阳县| 中宁县| 恩平市| 深州市| 辰溪县| 东明县| 横峰县| 元江| 屯门区|