C++中cin和cout中不會被注意的細節(字串的處理)
阿新 • • 發佈:2018-12-31
cout.put(ch);
與cout << ch;類似。但是隻可以輸出單個字元。
cin
cin使用空白(空格,製表符和換行符)來確定字串的結束位置。
例子:
#include <iostream>
using namespace std;
int main()
{
char ch[20];
cin >> ch;
cout << "ch = " << ch << endl;
}
可以看出cin只能讀取一個單詞,那麼如何讓cin讀取一行字串呢?
這裡引入兩個類的成員函式:
getline(char* ch,int n);
讀取一行輸入,直到到達換行符。丟棄換行符。
get(char* ch,int n);
讀取一行輸入,直到到達換行符。將換行符保留在輸入序列中。
ch是用來儲存輸入行的陣列名稱;n是要讀取的字元數(讀取n-1個字元,後面加‘\0’空字元)。
例子:
#include <iostream> using namespace std; int main() { char ch[20]; cin.getline(ch,20); char sh[20]; cin.getline(sh,20); cout << "ch = " << ch << endl; cout << "sh = " << sh << endl; }
空行的問題
get()的問題
get()函式將換行符保留,那麼下一個get()函式將讀取空字元,而無法繼續讀取後面的字元了。
#include <iostream> using namespace std; int main() { char ch[20]; cin.get(ch,20); char sh[20]; cin.get(sh,20); cout << "ch = " << ch << endl; cout << "sh = " << sh << endl; }
解決方法:
使用不帶任何引數的cin.get()或者;可以讀取下一個字元(即使是換行符)。
#include <iostream>
using namespace std;
int main()
{
char ch[20];
cin.get(ch,20).get();
char sh[20];
cin.get(sh,20);
cout << "ch = " << ch << endl;
cout << "sh = " << sh << endl;
}
PS:有引數的get函式讀到了空行(只有一個換行符)後,將設定失效位(failbit)。接下來的輸入將被阻斷(接收到的都是空的字串)。要用下面命令進行恢復:
cin.clear(); //恢復輸入
cin.get(); //吃掉換行符
getline()的問題
當輸入的字串比讀取的個數長的時候,getline將設定失效位,並且關閉後面的輸入。
#include <iostream>
using namespace std;
int main()
{
char ch[20];
cin.getline(ch,4);
char sh[20];
cin.getline(sh,4);
cout << "ch = " << ch << endl;
cout << "sh = " << sh << endl;
}
cin返回值
cin.get和cin>>返回一個cin物件,所以可以連寫輸入。
cin.getline(ch,20).get(sh,20); //
cin >> ch >> sh; //小心空格
(cin >> ch).get(sh);
下面兩個結果分別對應上面前兩行程式碼: