標籤:
聲明:下面實驗中[]裡面表示要輸入裡面的符號,[]符號本身並未輸入
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++ 中字串標準輸入的學習及實驗