2013-04-18 64 views
4

我有一個字符串流,我需要將第一部分取出,然後將其餘部分取出到單獨的字符串中。例如,我有字符串"This is a car",我需要以2個字符串結尾:a = "This"b = "is a car"獲取字符串流的其餘部分C++

當我使用stringstream的使用<<得到的第一部分,然後我用.str()轉換爲一個字符串,這當然給了我這一切。「This is a car",我怎樣才能得到它玩我怎麼想?

回答

5
string str = "this is a car"; 

std::stringstream ss; 
ss << str; 

string a,b; 
ss >> a; 
getline(ss, b); 

編輯:校正感謝@Cubbi:

ss >> a >> ws; 

編輯:

該解決方案可以處理在某些情況下,換行符(如我的測試情況下),但在別人失敗(如@ rubenvb的例子),而我還沒有找到一個乾淨的方式來解決它。 我認爲@ tacp的解決方案更好,更強大,應該被接受。

+0

這使得b''是一輛車「',使它成爲一輛車'',那麼'ss >> a >> ws;'? – Cubbi 2013-04-18 03:26:33

+0

謝謝,我用string.erase(0,1)來擺脫空間。 – Linkandzelda 2013-04-18 03:33:32

+0

@Cubbi:好點,但是你的解決方案恰恰假定了一個空白字符。我覺得像'b.erase(0,b.find_first_not_of(「...」))''更安全。 – Beta 2013-04-18 03:35:15

1

你可以讀出的第一位後做的流getline ....

2

您可以這樣做:首先獲取整個字符串,然後獲取第一個單詞,使用substr獲取其餘部分。

stringstream s("This is a car"); 
string s1 = s.str(); 
string first; 
string second; 

s >> first; 
second = s1.substr(first.length()); 
cout << "first part: " << first <<"\ second part: " << second <<endl; 

測試這GCC 4.5.3輸出:

first part: This 
second part: is a car 
+0

值得注意的是,如果原始字符串實際上是''這是一輛汽車'' – Rollie 2013-07-22 18:31:42

+0

,您也可以在沒有變量s1的情況下執行該操作,只需執行s.str()。substr(first.length()) ; – 2017-01-20 21:25:17

0

另一種方式做,這是rdbuf:

stringstream s("This is a car"); 
string first; 
stringstream second; 

s >> first; 
second << s.rdbuf(); 
cout << "first part: " << first << " second part: " << second.str() << endl; 

這可能是一個不錯的選擇,如果你最終將結果輸出到一個流而不是一個字符串。