13

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

4

4 回答 4

24

这是一个直截了当的解决方案。也许不是最有效的,但除非这是热代码或字符串很大,否则应该没问题。我们假设您的输入字符串被称为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"
于 2012-09-20T14:19:21.677 回答
5

更实用的方法是使用getline-based 迭代器,如this answer所示,然后使用 withstd::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.

于 2012-09-20T14:33:59.400 回答
3

如果您的字符串中的数据基本上就像一个文件,请尝试使用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();
于 2012-09-20T14:16:26.387 回答
1

您可以将其包装在 a 中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;
}
于 2012-09-20T14:22:35.470 回答