1. 程式人生 > >C++中cin和cout中不會被注意的細節(字串的處理)

C++中cin和cout中不會被注意的細節(字串的處理)

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);

下面兩個結果分別對應上面前兩行程式碼: