Cpp知識記錄與總結

2021-10-01 10:53:21 字數 3164 閱讀 3630

死迴圈case1:在寫學習《c++資料結構與演算法》的時候,鍊錶那一章有乙個圖書館程式,假如輸入錯誤之後(比如需要輸入乙個整數,卻輸入了乙個字元)就陷入了死迴圈。下面是乙個示例**:

#include

using

namespace std;

intmain()

return0;

}

執行該程式,輸入

1~1

~23546~23~

~546~f

000.

..陷入死迴圈,一直輸出0

問題:為什麼不讓我輸入了呢?答案來自cin的用法及清空緩衝區。

分析:第一次輸入——1+回車,則cin』將緩衝區裡的1給a;此時緩衝區為空

第二次輸入——23 546+回車,因為當緩衝區中有殘留資料時,cin函式會直接去讀取這些殘留資料而不會請求鍵盤輸入;所以,這時迴圈執行了兩次;第一次cin將23給a,,第二次跳過中間空格,把546給a。此時緩衝區為空。而且,回車符也會被存入輸入緩衝區中。

前面兩次輸入,都是合法輸入。

第三次輸入——f+回車,這時第乙個字元為非法輸入(需要的是int),這時會將0給a。本次迴圈後,緩衝區不為空,而是存了回車符。因此下一次迴圈,不會等待下一次輸入,而是將緩衝區的回車符作為輸入。這時依然是非法輸入,a的結果還是0,並且會一直這樣迴圈下去。

解決方法:

#include

using

namespace std;

intmain()

}return0;

}

參考:c++輸入cin,cin.get(),cin.getline()詳細比較及例子

下面只是簡述,詳細例子可以檢視參考鏈結

1.2.1 cin

結束條件:[enter],[space],[tab]

處理方法:cin遇到緩衝區中的[enter],[space],[tab]會結束當前輸入,並捨棄[enter],[space],[tab],繼續下一項輸入,當有連續[space],[enter,[tab]會全部捨棄。

1.2.2 cin.get

(1)一引數

用法:a = cin.get() 或者 cin.get(a)

結束條件:輸入字元足夠後回車

說明:這個是單字元的輸入,用途是輸入乙個字元,把它的ascall碼存入到a中

處理方法:與cin不同,cin.get()在緩衝區遇到[enter],[space],[tab]不會作為捨棄,而是繼續留在緩衝區中

#include

using

namespace std;

main (

)

(2)二引數

用法:cin.get(arrayname,size) 把字元輸入到arrayname中,長度不超過size

注釋:arrayname必須是char型別,即char陣列型別,不可以為string型別;size是指輸入長度,即允許輸入的最大長度。

一般size』限制了輸入的大小,接受字串的長度可以擴充套件,最多擴充套件至size大小。

處理方法:假設把資料輸入到 char a[arraylength],陣列長度為arraylength。cin.get(a,size)—size,arraylength不同可以分為四類:

類1:輸入串長例1:char a[10];cin,get(a,20);

輸入:123456789012[enter]

輸出a陣列:123456789012 可以發現,輸入12個字元到a[10]中,系統自動擴充a[10],此時實際陣列長為13(『123456789012』\0』』)。但當計算sizeof(a)時,還是現實為10

類2:輸入串長例2:char a[10];cin.get(a,20);

輸入:12345[enter]

輸出:12345,此時陣列內資料為『12345『\0』』

類3:輸入串長》size,先擷取size個字元,若還是大於arraylength,則輸入前arraylength-1個字元,最後補充『\0』

例3:char a[5];cin,get(a,10);

輸入:123456789012[enter]

輸出:123456789 先擷取了9個字元變成『123456789『/0『』,然後放入到a中,a自動擴張長度

類4:輸入串長》size,先擷取size個字元,若小於arraylength,則把擷取串放入陣列中,最後補充『\0』

例4:char a[15],cin.get(a,10)

輸入:123456789012[enter]

輸出:123456789 此時陣列內為『123456789『\0』』 注意:前size-1有效,最後乙個補『\0』

綜上:當吧大於陣列長度的字串放出char a[arraylength]中,系統自動擴張陣列a的長度使a能放得下,但是這麼做容易產生執行錯誤

(3)三引數

用法:cin.get(arrayname,size,s) 把資料輸入到arrayname字元陣列中,當到達長度size時結束或者遇到字元s時結束

注釋:a必須是字元陣列,即char al型別,不可為string型別;size為最大的輸入長度;s為控制,遇到s則當前輸入結束快取區里的s將被捨棄

3.cin.getline()基本用法

cin.getline()的用法和cin.get()用法大致相同,沒有一引數用法,只有二引數,三引數兩類

cin.gerline(arrayname,size)

cin.getline(arrayname,size,s)用法與cin.get()效果大致相同,但也有些區別

(1)cin.getline(arrayname,size)與cin.get(arrayname,size)的區別

cin.get(arrayname,size)當遇到[enter]時會結束目前輸入,他不會刪除緩衝區中的[enter]

cin.getline(arrayname,size)當遇到[enter]時會結束當前輸入,但是會刪除緩衝區中的[enter]

(2)cin.getline(arrayname,size,s)與cin.gei(arrayname,size,s)的區別

cin.getline(arrayname,size,s)當遇到s時會結束輸入,並把s從緩衝區中刪除

雜碎知識記錄

清除客戶端快取 response.cache.setcacheability httpcacheability.nocache 絕對過期快取 向 cache 中插入具有依賴項和過期策略的物件。引數key用於引用該物件的快取鍵。value 要插入快取中的物件。dependencies 所插入物件的檔案...

小知識記錄

清除浮動 新增子元素,左右都不允許出現浮動元素。清除a的下劃線 text decoration none 清除li前的小圓點 li 聖杯布局 negative margin 關於文件流,浮動流和position input標籤的型別 color,date,email 可使用偽類 或 元素。style...

linux小知識記錄

1 linux的程序和執行緒 程序建立通常呼叫fork實現。建立後子程序和父程序指向同一記憶體區域,僅當子程序有write發生時候,才會把改動的區域copy到子程序新的位址空間,這就是copy on write技術,它極大的提高了建立程序的速度。linux執行緒是通過程序來實現。linux kern...