天天看點

總結:C++中用cin對象進行字元和字元串的輸入幾種方法幾個概念單字元輸入字元串輸入

幾個概念

1)cin是istream類的一個對象

2)cin對象将标準輸入表示為位元組流,通常情況下,通過鍵盤來生成這種字元流

3)istream重載了抽取運算符>>,用于從輸入流中抽取字元

通常可以這樣使用:cin >> value_holder;

其中value_holder為存儲輸入的記憶體單元,它可以是變量,引用,解除引用的指針,也可以是類或結構的成員。

4)格式化輸入函數:可以将輸入資料轉換為目标指定的格式

5)抽取運算符 >>屬于格式化輸入函數

經典的運算符函數原型 :istream& operator >> (int &);

即傳入參數為某類型(int / double / char / char* 等)的引用,傳回值為istream類型的引用

由于傳回值為調用對象的引用,則可以直接修改參數的變量的值,并且,這使得能夠将輸入拼接起來,如:cin >> a >> b >> c;

注意:

抽取運算符>>跳過空白(空格、換行符、制表符)!!! ,直到遇到非空白字元。

單字元輸入

(1)成員函數get(char&)

傳入參數為char類型的引用,傳回值類型為調用它的istream對象,這意味着 可以拼接 get(char&)後面的其它抽取,如:

char c1, c2, c3;
cin.get(c1).get(c2) >> c3;      
           

如果cin.get(char&)到達檔案尾----無論是真正的檔案尾,還是通過鍵盤仿真的檔案尾(對于Windows指令提示符模式和DOS,為按下Ctrl + Z;對于UNIX,是在首行按下Ctrl + D),它都不會給參數指派。另外,該方法還調用setstate(failbit),導緻cin的測試結果為false:

char ch;
while (cin.get(ch)) {
	//程式
}
           

隻要存在有效輸入,cin.get(ch)的傳回值都将是cin,此時的判定結果為true,是以循環将繼續。到達檔案尾時,傳回值判定為false,循環終止。

(2)成員函數get()

沒有傳入參數,傳回值類型為int(或某種更大的整型,這取決于字元集和區域),是以不可以拼接!

char ch;
ch = cin.get();
           

到達檔案後(不管是真的檔案尾還是模拟的檔案尾),cin.get()都将傳回值EOF—頭檔案iostream提供的一個符号常量。這種設計特性使得可以這樣來讀取輸入:

int ch;		//注意:這裡ch的類型為int,而不是char,因為值EOF可能無法使用char類型來表示。
while ((ch = cin.get()) != EOF) {
		//程式
}
           

注意事項:

在使用char參數 get(char) 或沒有參數 get() 的情況下,get()方法讀取下一個輸入字元,即使該字元是空格、制表符或換行符。即:不會跳過空白字元(空格、換行符、制表符)!!!

特征 cin.get(ch) ch = cin.get()
傳輸輸入字元的方法 賦給參數 ch 将函數傳回值賦給 ch
字元輸入時函數的傳回值 指向 istream 對象的引用 字元編碼(int值)
到達檔案尾時函數的傳回值 轉換為false EOF

采用哪種單字元輸入形式?

首先,應确定是否希望跳過空白,如果跳過空白友善,則使用抽取運算符>>

如果希望程式檢查每個字元,應使用get()方法,例如,計算字數的程式可以使用空格來判斷單詞何時結束。在get()方法中,get(char&)的接口更佳。沒有參數的get()主要優點是,它與标準C語言中getchar()函數極其類似,這意味着可以通過包含iostream()(而不是stdio.h),并使用cin.get()替換所有的getchar(),用cout.put(ch)替換所有的putchar(char),來将C程式轉換為C++程式

字元串輸入

istream& get(char*, int);
istream& get(char*,  int, char);
istream& getline(char*, int);
istream& getline(char*, int, char);
           

第一個參數,用于放置輸入字元串的記憶體單元的位址

第二個參數,比讀取的最大字元數大1(額外的一個字元用于存儲結尾的空字元,以便将輸入存為一個字元串)

第三個參數,指定用于作為分界符的字元,隻有兩個參數的版本将換行符用作分界符。

上述4個函數都在讀取最大數目的字元或遇到換行符後為止。

注意差別:

get()将分界符留在輸入流中,這樣接下來的輸入操作首先看到的将是分界符,而getline()抽取并丢棄輸入流中的分界符

可以參考一下代碼體會一下!

#include <iostream>
const int Limit = 255;

int main()
{
    using std::cout;
    using std::cin;
    using std::endl;

    char input[Limit];

    cout << "Enter a string for getline() processing:\n";
    cin.getline(input, Limit, '#');
    cout << "Here is your input:\n";
    cout << input << "\nDone with phase 1\n";

    char ch;
    cin.get(ch);
    cout << "The next input character is " << ch << endl;

    if (ch != '\n')
        cin.ignore(Limit, '\n');    // discard rest of line

    cout << "Enter a string for get() processing:\n";
    cin.get(input, Limit, '#');
    cout << "Here is your input:\n";
    cout << input << "\nDone with phase 2\n";

    cin.get(ch);
    cout << "The next input character is " << ch << endl;
/* keeping output window open */
/*
    cin.clear();
    while (cin.get() != '\n')
        continue;
    cin.get();
*/
    return 0; 
}
           
總結:C++中用cin對象進行字元和字元串的輸入幾種方法幾個概念單字元輸入字元串輸入
方法 行為
getline(char*, int) 如果沒有讀取任何字元,如立刻達到了檔案尾(但換行符被視為讀了一個字元),則設定failbit ; 如果讀取了最大數目的字元,且行中還有其它字元,則設定failbit
get(char*, int) 如果沒有讀取任何字元,則設定failbit;如果讀取了最大數目的字元則不設定failbit;