1. 程式人生 > >c++字符串的輸入的思考

c++字符串的輸入的思考

spa 細節 作用 代碼 絲毫 出了 get etl cin

字符串的輸入,是學習c++的一個重點,也是一個極富有細節意味的知識點,如果你不了解這些細節,你可能會在寫程序時犯錯而一臉懵逼不知所措。

與此同時,我們要了解c++緩沖區的概念,程序的輸入都建有一個緩沖區。輸入的過程大概是這樣的,一次輸入結束,鍵盤會向緩沖區存入數據,而相應的讀取函數會從緩沖區讀取,我們來用具體的代碼來演示一下緩沖區具體怎麽工作;

技術分享

仔細看上述代碼,我的代碼裏定義了四個char類型的字符串,並且有cin輸入,但是當我們輸入一個具有空格的字符串時,直接輸出了而忽略了人為的繼續輸入,原因是什麽呢?

現在仔細考慮輸入流的概念,當我們輸入第一串字符串時,我個人理解的是,cin此時沒有起作用,我們只是簡單的把字符(包括空格,TAB,換行)存到輸入流裏,當我們按下ENTER(換行)停止鍵盤向輸入流輸送數據,然後cin輸入函數開始從輸入流取數據。

對於cin來說,它會直接從緩沖區讀取,當遇到空格,TAB,換行符時,結束輸入,正如上述代碼所示,我們的cin>>a從輸入流提取數據,hereisa提取完後,遇到一個空格,提取結束,然後是cin>>b,cin>>c,cin>>d同樣的操作。於是我們看到上述的輸出。


cin.get()和cin.getline()兩個函數及其相似,大多數情況我們可以將其二者混用,它們的輸入可以輸入空格,TAB,但遇到空格時結束輸入,他們的區別是 getline剔除換行符,而cin.get()則保留換行符。我們看一段代碼的測試及結果:

技術分享

技術分享

通過上述兩段代碼,我們看到,對於cin.get()來說,他是保留空格符的,也就是說,他會把空格符保留下來,並且它本身遇到空格符就停止了,然後保留下來的空格符就被下一個讀取函數讀取了,等價於下個函數提取數據時直接遇到換行符,就直接結束了;而cin.getline()則不同,它別具一格,它英俊瀟灑,它遇到換行符時它直接結束,可以把它看成狼人殺的獵人,它死了,它還要帶走一個,然後它帶走了空格符,它把空格符剔除了,下面的輸入絲毫不受影響。

這些c++方面的輸入輸出,應該說是最基本的知識,但是基本功不紮實,怎麽能寫出高魯棒的代碼呢?

c++字符串的輸入的思考