使用getline()忽略空格/制表符/换行符

时间:2014-06-26 10:30:10

标签: c++ stl

我在网上经历了很多资源,但仍无法得到这些资源。我不明白怎么做 std :: skipws可以忽略空格,制表符和换行符。

以下是我的简单代码

vector<string> vec;
while(1){

    getline(cin, s); 

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

我将输入一行字符串,其中包含换行符,空格和制表符。输入后我想将字符串存储到向量中,并在遇到“#”字符串时停止。我尝试使用上面的代码,但它会在向量中存储空格以及字符串,尽管它在“#”之后终止。

2 个答案:

答案 0 :(得分:2)

std::getline的目的是将整行(包括空格)读入字符串缓冲区。

如果要从流中读取标记,跳过空格,请使用标准输入运算符>>

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

Live example

答案 1 :(得分:0)

std::skipws仅跳过任何输入流中的前导空格字符。因此,它对第一个非空格后的所有空格没有影响。如果你想用getline(cin, s)读取整行,你可以考虑删除从字符串中读取的空格和制表符,然后将其推入容器中,如下所示:

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 );
    }
} 

有关如何从字符串中删除空格的讨论,请参阅:Remove spaces from std::string in C++