C++ 基础(5):String

2 min

本文是对 C++ 基础(3):Streams 的应用。

写:统一拼接并最后一次性拿到字符串

在工程里,如果需求只是不断把不同类型的数据拼接起来,最后得到一个完整字符串,那么最推荐使用 std::ostringstream。它的语义很明确:只负责写入,不负责解析。

std::ostringstream os;

os << "this";
os << " ";
os << "is";

std::string data = os.str();

这里的 os 可以理解成一个“字符串构造器”。前面的 << 都是在往内部缓冲区写内容,最后通过 str() 一次性得到完整的 std::string

读:已经有字符串,现在要从里面解析内容

如果需求是读取一个已有字符串中的内容,例如按空格、逗号、换行解析,那么应该使用 std::istringstream

下面代码展示了根据空格拆分单词的例子:

std::string data = "this is";

std::istringstream is(data);

std::string word;
while (is >> word) {
    std::cout << word << std::endl;
}

下面代码展示了把分隔符拼接的字符串还原成 token 的例子:

#include <sstream>
#include <vector>
#include <string>

using namespace std;

// "1,2,#,4,#,#,3,#,#,"
// ->
// vector<string> nodes = {"1", "2", "#", "4", "#", "#", "3", "#", "#"};

vector<string> split(const string& data, char sep = ',') {
    vector<string> nodes;
    istringstream is(data);

    string token;
    while (getline(is, token, sep)) {
        nodes.push_back(token);
    }

    // 如果最后一个是空串,说明是 trailing delimiter
    if (!nodes.empty() && nodes.back().empty()) {
        nodes.pop_back();
    }

    return nodes;
}