溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解C++字符串輸入緩沖區(qū)機制

發(fā)布時間:2021-10-28 17:27:25 來源:億速云 閱讀:204 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“如何理解C++字符串輸入緩沖區(qū)機制”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解C++字符串輸入緩沖區(qū)機制”吧!

一、緩沖定義

1.緩沖定義

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

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

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

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

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

1.scanf和cin的緩沖類型

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

2.scanf和cin的緩沖機制

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

3.cin.getline和cin.get

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

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

4.scanf和cin輸入

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

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

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

5.可能遇到的問題

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

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

結(jié)果如下截圖:

如何理解C++字符串輸入緩沖區(qū)機制

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

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

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

結(jié)果如下截圖:

如何理解C++字符串輸入緩沖區(qū)機制

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

③讀入一個字符串之后后面的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é)果如下截圖:

如何理解C++字符串輸入緩沖區(qū)機制

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

④整形和字符串混合輸入

當先輸入一個整形再用cin.getline輸入字符串會發(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é)果如下:

如何理解C++字符串輸入緩沖區(qū)機制

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

清除緩沖區(qū)

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

感謝各位的閱讀,以上就是“如何理解C++字符串輸入緩沖區(qū)機制”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對如何理解C++字符串輸入緩沖區(qū)機制這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI