2012-02-23 106 views
6

我的代碼看起來像這樣,函數getline(CIN,ASTRING)接收輸入而不另一個輸入

string aString; 
cin >> aString; 
cout << "This is what cin gets:" << aString << endl; 
getline(cin, aString); 
cout << "This is what getline(cin, <string>) gets:" << aString << endl; 

每次我跑了,我給喜歡,「12」,我得到「12」和「」投入。

我想知道爲什麼getline會在沒有用戶輸入的情況下收到。

我可以理解,當我輸入「12 24」之類的東西時,cin會得到「12」,並且getline應該得到其餘部分。 (另外,如果有人可以回答,那麼之間的空間被視爲cin的結束,爲什麼它傳遞給getline?)

剛開始使用C++的字符串,所以請不要太難。謝謝。

+0

如果你已經得到了輸入,除非有更多的輸入,否則沒有什麼可以獲得的...... – AJG85 2012-02-23 19:09:38

回答

12

當您將標準流提取與getline混合使用時,您有時會使用getline返回空字符串。原因在於,如果您使用>>讀取輸入內容,用戶輸入的用於表示它們已完成的換行符不會從輸入流中移除。因此,當您調用getline時,函數將讀取剩餘的換行符並將空字符串返回。

爲了解決這個問題,無論是堅持用函數getline您的輸入,或者使用WS流處理器讀取後提取額外空白:

cin >> value >> ws; 

這將吃掉換行,解決了這個問題。

希望這會有所幫助!

7

這就是我得到:

std::string str; 
std::cin >> str; //hello world 
std::cout << str; //hello 

這是因爲流運算符的空白標記化

std::string str; 
std::getline(std::cin, str); //hello world 
std::cout << str; //hello world 

你得到充分的線,函數getline()的作品,直到它找到第一端並將該值作爲字符串返回。

但是,當標記化時,如果流中存在字符(例如'\ n'),那麼當getline被調用時將訪問這些字符,您將需要清除流。

std::cin.ignore(); 
1

「cin >> x」不會消耗輸入流中的換行符,因此使用getline檢索的下一行將包含空字符串。解決此問題的一種方法是使用getline逐行檢索輸入並使用字符串流來標記每行。從stringstream提取所有輸入後,關鍵是調用stringstream :: clear()來清除字符串流上設置的EOF標誌,以便稍後在代碼中重用。

下面是一個例子:

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() { 
    string line; 
    stringstream ss; 
    getline(cin, line); 
    ss << line; 
    int x, y, z; 
    //extract x, y, z and any overflow characters 
    ss >> x >> y >> z >> line; 
    ss.clear(); 
    //reuse ss after clearing the eof flag 
    getline(cin, line); 
    ss << line; 
    //extract new fields, then clear, then reuse 
    //... 
    return 0; 
} 

根據每個輸入線的長度,讓整條生產線的時間和內存處理這大概不是做控制檯IO更高效的每個令牌,你要從標準輸入中提取。

相關問題