循环访问字符串 C++ 中的行

iterate through lines in a string c++

本文关键字:C++ 访问 字符串 循环      更新时间:2023-10-16

这是我需要做的。 我在C++有一个字符串。 对于字符串中的每一行,我需要在行首附加几个字符(如">>")。 我正在努力解决的是一种将字符串拆分为换行符的好方法,遍历附加字符的元素,然后将字符串重新连接在一起。 我已经看到了一些想法,例如strtok(),但我希望c ++字符串会有一些更优雅的东西。

这是一个直接的解决方案。也许不是最有效的,但除非这是热代码或字符串很大,否则它应该做得很好。我们假设您的输入字符串称为 input

#include <string>
#include <sstream>
std::string result;
std::istringstream iss(input);
for (std::string line; std::getline(iss, line); )
{
    result += ">> " + line + "n";
}
// now use "result"

一种更实用的方法是使用基于getline的迭代器,如本答案所示,然后将其与std::transform一起使用来转换所有输入行,如下所示:

std::string transmogrify( const std::string &s ) {
    struct Local {
        static std::string indentLine( const std::string &s ) {
            return ">> " + s;
        }
    };
    std::istringstream input( s );
    std::ostringstream output;
    std::transform( std::istream_iterator<line>( input ), 
                    std::istream_iterator<line>(),
                    std::ostream_iterator<std::string>( output, "n" ),
                    Local::indentLine );
    return output.str();
}

indentLine助手实际上缩进了行,换行符由ostream_iterator插入。

如果字符串中的数据基本上类似于文件,请尝试使用 std::stringstream .

std::istringstream lines( string_of_lines );
std::ostringstream indented_lines;
std::string one_line;
while ( getline( lines, one_line ) ) {
    indented_lines << ">> " << one_line << 'n';
}
std::cout << indented_lines.str();

您可以将其包装在stringstream中,并使用std::getline一次提取一行:

std::string transmogrify(std::string const & in) {
    std::istringstream ss(in);
    std::string line, out;
    while (getline(ss, line)) {
        out += ">> ";
        out += line;
        out += 'n';
    }
    return out;
}