2014-06-26 87 views
0

我在網絡上瀏覽了大量資源,但仍無法獲取該資源。我不明白 std :: skipws如何工作來忽略空格,製表符和換行符。使用getline忽略空格/製表符/換行符

以下是我簡單的代碼

vector<string> vec; 
while(1){ 

    getline(cin, s); 

    if(s.compare("#") == 0) 
     break; 
    else 
     vec.push_back(s); 
} 

我將進入一個符合換行,空格和製表符的字符串。輸入後,我想將字符串存儲到向量中,遇到「#」字符串時會停止。我試着用上面的代碼,但它存儲空間以及向量中的字符串,儘管它在輸入「#」後終止。

回答

2

std::getline的目的是將整行(包括空格)讀入字符串緩衝區。

如果您想從流中讀取標記,跳過空格,然後使用標準輸入運算符>>

std::vector<std::string> vec; 
std::string s; 
while(std::cin >> s && s != "#") { 
    vec.push_back(s); 
} 

Live example

+0

謝謝@Snps ... – cbinder

0

std::skipws被跳過僅在任何輸入流中的前導空白字符。因此它對第一個非空白之後的所有空格沒有影響。如果你想讀整行與getline(cin, s)您不妨考慮將其推入容器中,像這樣在拆除已經從字符串讀取的空白和tab:

while (1){ 
    getline(cin, s); 
    if (s.compare("#") == 0) { 
     break; 
    } 
    else { 
     s.erase(remove_if(s.begin(), s.end(), ::isspace), s.end()); 
     vec.push_back(s); 
    } 
} 

對於討論如何刪除空格from a string參見:Remove spaces from std::string in C++