2014-06-26 86 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++