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

Ignoring whitespaces/tabs/newlines with getline()

本文关键字:空白 制表符 换行符 getline 使用      更新时间:2023-10-16

我在网上找了很多资料,但还是找不到这个。我不明白是怎么回事Std::skipws可以忽略空格、制表符和换行符。

下面是我的简单代码
vector<string> vec;
while(1){
    getline(cin, s); 
    if( s.compare("#") == 0)
        break;
    else
        vec.push_back(s);
}   

我将输入一行带有换行符、空格和制表符的字符串。输入后,我想将字符串存储到向量中,当遇到"#"字符串时,这将停止。我尝试了上面的代码,但它将空间与矢量中的字符串一起存储,尽管它在输入"#"后终止。

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

如果您想从流中读取令牌,跳过空白,则使用标准输入操作符>>

std::vector<std::string> vec;
std::string s;
while(std::cin >> s && s != "#") {
    vec.push_back(s);
}
<<p> 生活例子/strong>

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

关于如何从字符串中删除空格的讨论参见:从std::string中删除空格