Let's Rock!
cin
1.cin是類istream的對象,其中包含cin>>,cin.get,cin.getline等方法。
2.我們在鍵盤上敲打出字符串,通過按下回車鍵將字符串送入標準輸入緩沖區。cin的緩沖區在存儲字符串時將回車鍵(/r)轉化為 ' /n ' 存儲,若輸入"123"并按下回車,cin的緩沖區內將為"123/n"四個字符。
3.cin的成員函數從緩沖區中讀取字符,并在緩沖區為空時阻塞,等到緩沖區中出現字符時讀取。
cin>>
1.cin>>等價于cin.operator>>(),他對于緩沖區內空格,換行符,回車的處理采取以下規則:
(1)若cin>>在緩沖區中首先讀取到的是空格,換行符,回車等分隔符時,它將清除這些分隔符并讀取后面的非分隔符字符。
(2)cin>>可以同時讀取多個字符,這些字符之間用分隔符分開,被讀取的字符與它們之間的分隔符不再存在于緩沖區中。
(3)若cin>>已經完成了讀取,將對緩沖區仍然存在的分隔符,字符不作處理。
2.若希望cin>>同樣讀取換行符,可提前使用語句:cin>>noskipws;,使用語句:cin>>skipwa;恢復。
cin.get
1.使用char c=cin.get()或cin.get(char c)獲取一個字符,無論該字符是否為分隔符都將被cin從緩沖區中讀取,我們可以使用cin.get()來吸收之前輸入字符剩下的回車符號,也可以在程序最后使用cin.get()讓它在運行完成后不會自動關閉。
2.使用cin.get(str,size)讀取字符串,在遇到換行符/n時停止讀取,并仍然保留換行符/n在緩沖區中。使用函數getline(str,size)同樣可以讀取字符串,在遇到/n時停止讀取,但getline將在讀取后清除該換行符。
3.cin.get()僅可以用于讀取char*(數組)類型的字符串,getline則還可以讀取string類型的字符串。
cin.getline
1.cin.getline(char* s,size,char delim)同樣用于讀取字符串,在字符串中出現delim時停止讀取。若只使用cin.getline(char* s,size)則默認為遇到換行符結束。
2.cin.getline將在讀取后清除緩沖區內的結束符。
cin condition state
To be completed
getline,gets,fgets
1.getline是定義在命名空間std中的全局函數,在頭文件<string>中被定義,使用方式為getline(cin,str,delim),使用方式與cin.getline相似。
2.getline與cin.getline的不同在于:
1.cin.getline屬于istream流,getline屬于string流。
2.cin.getline讀取后將結束符清除,getline讀取結束符并將結束符轉化為'/0'儲存。
3.gets與fgets是c語言的庫函數,使用方式為gets(char* s),fgets(char* s,sizeof(s),stdin)。gets在遇到換行符前一直讀取字符并存儲在s中,并在s的結尾儲存NULL作為結束,若s儲存空間不夠將發生溢出的情況;fgets在遇到換行符或者讀取字符長度到達sizeof(s)-1時結束,并在s的結尾存儲'/o'作為結束。
summary
1.在存儲string類型變量時使用getline函數,cin的成員變量、gets、fgets只能用于存儲數組類型變量。
2.cin.get、cin.getline不處理結束符,使用它們存儲字符串時要注意緩沖區中仍然存在的結束符。
3.cin的成員變量在頭文件istream中定義,getline在string中定義,gets,fgets在cstdio中定義。