C++ 中字串標準輸入的學習及實驗

來源:互聯網
上載者:User

標籤:

聲明:下面實驗中[]裡面表示要輸入裡面的符號,[]符號本身並未輸入

1、cin>>

cin使用空白(空格、定位字元、斷行符號)來確定字串的結束位置。

 1 #include<iostream> 2 using namespace std; 3  4 int main() 5 { 6     char p[100]; 7     char q[100]; 8     cin>>p; 9     cout<<p;10     cin>>q;11     cout<<q;12     return 0;13 }

實驗:上述程式中輸入:good [空格或者tab] job [斷行符號],然後似乎還沒等輸入第二個字串q的值,就已經輸出了good job
原因:cin>>把good作為第一個字串賦值給p,然後job被留在了輸入隊列中,當執行到cin>>q的時候,發現隊列裡已經有job了,就直接將job賦值給q,然後執行cout<<q。

2、面向行的輸入cin.get()、cin.getline()

這兩個函數都是cin的成員函數,功能都是讀取一行,遇到分行符號(斷行符號)認為是字串的結尾,不同的是getline()將分行符號從輸入隊列中丟棄,而get()會將分行符號保留到隊列中。

(1)cin.get()

原型:

cin.get(char *str,int ArSzie, char delim)
cin.get(char *str,int ArSzie)
cin.get(void)
cin.get(char)

讀字串的時候用的是前兩個原型,而第三個原型可以讀取任何字元(包括分行符號)

參數說明:str讀取字串所放置的位置,ArSize要讀取字串的最大長度,如ArSize為5的時候,則strlen(str)最大隻能為4,因為最後一個要放‘\0‘,delim停止符,如果不設定,則預設為分行符號

功能:讀取一行字串到str中,然後將遇到的停止符留在輸入隊列中。

程式1

 1 #include<iostream> 2 using namespace std; 3  4 int main() 5 { 6     char p[100]; 7     char q[100]; 8     cin.get(p,5); 9     cout<<p<<endl;10     return 0;11 }

輸入abcde  輸出abcd 。原因:cin.get(p,5)說明p的最大空間長度是5(包括‘\0‘),所以p裡面讀取到了abcd‘\0‘

程式2

 1 #include<iostream> 2 using namespace std; 3  4 int main() 5 { 6     char p[100]; 7     char q[100]; 8     cin.get(p,5,‘#‘); 9     cout<<p<<endl;10     return 0;11 }

輸入ab#c,輸出ab
程式3

 1 #include<iostream> 2 using namespace std; 3  4 int main() 5 { 6     char p[100]; 7     char q[100]; 8     cin.get(p,5); 9     cout<<p<<endl;10     cin.get(q,5);11     cout<<q<<endl;12     return 0;13 }

輸入abc斷行符號,輸出abc,然後直接兩個空白行,結束,沒給機會輸入q,原因是cin.get(p,5)遇到分行符號的時候並沒有將分行符號從輸入隊列中丟棄,然後cin.get(q,5)的時候,上來就碰到分行符號以為輸入結束,所以q值為空白
解決辦法,cin.get(p,5),用cin.get()將分行符號從輸入隊列中讀走,如程式4

程式4

 1 #include<iostream> 2 using namespace std; 3  4 int main() 5 { 6     char p[100]; 7     char q[100]; 8     cin.get(p,5); 9     cin.get();10     cout<<p<<endl;11     cin.get(q,5);12     cout<<q<<endl;13     return 0;14 }

這回p、q都有機會正確的輸入輸出了

(2)cin.getline()

原型:

cin.getline(char *str,int ArSzie, char delim)
cin.getline(char *str,int ArSzie)

參數說明:str讀取字串所放置的位置,ArSize要讀取字串的最大長度,如ArSize為5的時候,則strlen(str)最大隻能為4,因為最後一個要放‘\0‘,delim停止符,如果不設定,則預設為分行符號

功能:讀取一行字串到str中,然後將遇到的停止符從隊列裡剔除。

前三個函數和cin.get()的結果一樣所以就不再寫了,下面直接寫一個與cin.get()的程式4想對應的程式,進行對比

 1 #include<iostream> 2 using namespace std; 3  4 int main() 5 { 6     char p[100]; 7     char q[100]; 8     cin.getline(p,5); 9     cout<<p<<endl;10     cin.getline(q,5);11     cout<<q<<endl;12     return 0;13 }

該程式中p、q都能正常輸入輸出,原因對比cin.getline和cin.get的功能即可

3、getline()   

使用時要#include<string> 

原型:

istream& getline ( istream &is , string &str , char delim );

istream& getline ( istream& , string& );

參數:

is 進行讀入操作的輸入資料流

str 儲存讀入的內容

delim 終結符

傳回值:
參數is是一樣的

功能:

將輸入資料流is中讀到的字元存入str中,直到遇到終結符delim才結束。對於第一個函數delim是可以由使用者自己定義的終結符;對於第二個函數delim預設為 ‘\n‘(分行符號)。函數在輸入資料流is中遇到檔案結束符(EOF)或者在讀入字元的過程中遇到錯誤都會結束。在遇到終結符delim後,delim會被丟棄,不存入str中。在下次讀入操作時,將在delim的下個字元開始讀入。

getline()和cin.getline()區別:

(1)cin.getline()屬於istream流,而getline()屬於string流,所以使用getline()的時候要包含標頭檔string

(2)原型不一樣,特別注意字串的參數類型cin.getline()中字串是char *,它可以將字串讀入到char *型的字串,也可以將字串讀入到string類型的字串中,getline()原型中的字串時string類型,所以只能讀入到string類型的字串中,不可以讀入到char *類型中

(3)輸入的時候cin.getline限定了輸入的最大位元組數,而getline沒有限制,其實本質原因還是因為原型不一樣

 

C++ 中字串標準輸入的學習及實驗

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.