2015-05-03 69 views
0

我寫了一個程序,其中有一個類。在這個類中,有一個超載的函數調用運算符,它需要一個對象和一個std::string對象,並且有一個while循環,我們無限期地輸入並連接到std::string參數。爲什麼不是一個字符串的第一個輸入不被分配給std :: string對象?

問題是第一個輸入未被連接到std::string參數中。雖然我解決了這個問題,但我無法理解爲什麼會發生這種情況。

這是完整的程序:

#include <iostream> 
#include <string> 
#include <vector> 
#include <iterator> 

using namespace std; 

class PrintString { 
public: 
void operator() (istream& is, string &ss) { 

    // string s; (1) 
    while (is >> ss) { 
     ss += ss; 
    } 

    if (is) 
     ss = ""; 

} 
/* 
* (1): I fixed this by defining another std::string object 
* and using that to assign to ss. After I did this everything 
* is working as I wanted it to be. 
*/ 
}; 

int main() { 

    cout << "enter some words, press ctrl+d to quit\n"; 
    vector<string> vec; 
    PrintString obj; 

    string s1; 
    s1.clear(); 
    obj(cin,s1); 
    vec.push_back(s1); 

    for (const auto &elem: vec) 
     cout << elem; 

    return 0; 
} 

輸出是這樣的:

enter some words, press ctrl+d to quit 
amsndjanjskndna. <- This is the first input 
mnmn, <- This is the second input 
mnmn,mnmn, <- But in the output the first input is not seen 

在我的系統我使用的Xcode 6.0.1版本

回答

1

之所以失敗是你的

is >> ss 

覆蓋了以前讀取中存儲在ss中的所有內容。所以如果你已經有了ss的東西,它將被新讀取的字符串替換。

當你寫,你可以讀入一個額外的變量解決這個問題:

string s_read; 
while (is >> s_read) { 
    ss += s_read; 
} 
1

你被直接傳遞輸入到它覆蓋的字符串的內容:

while (is >> ss) // '>>' overwrites current content of 'ss' 
{ 
    ss += ss; //then appends it to itself (now 'ss' holds doubled content) 
} 

使用臨時std::stringstdin開始輸入:

string input; 
while (is >> input) 
{ 
    ss += input; 
} 

另外,如果你想知道更多關於

istream& operator>> (istream& is, string& str) 

閱讀this page

相關問題