【问题标题】:Cpp: parse string snippets to tupleCpp:将字符串片段解析为元组
【发布时间】:2021-01-04 16:41:30
【问题描述】:

我想将字符串 sn-ps 解析为一个元组: 示例字符串:“Dolly Davenell,8809903417,1 Toban Circle,洛州” 元组

我从文件中读取字符串并使用 getline 将它们存储在向量 (myPersVec) 中,其中每个向量元素都是如上所述的字符串。

现在我的问题是我不知道如何分隔每个字符串元素并将其填充到每个元组元素中。

我知道我可以用分隔符分隔字符串元素,但是如何将其解析为元组? 然后我想将每个元组保存到另一个 Vector (my2ndVec)

我的问题是:一旦我有了字符串标记,我怎样才能以正确的顺序将它们解析为一个元组?

auto makeT([](std::string line, std::vector<std::tuple<std::string, unsigned int, std::string, std::string>>& my2ndVec, std::vector<std::string> myPersVec) {
    std::string token;
    std::string deli = ",";
    int pos = 0;
    while ((pos = line.find(deli)) != std::string::npos) {
        token = line.substr(0, pos);
        std::cout << token << std::endl;
        line.erase(0, pos + deli.length());
    }
    //how can i parse the tokens now into the tuple? and how do i parse them since i need to get multiple tokens
});
  1. 编辑:错字

【问题讨论】:

  • 您不能将std::string 传递给strtok
  • 那么究竟是什么你不知道该怎么做呢?创建一个元组?为元组中的元素赋值?将字符串转换为数字?也许澄清一点。这些事情都不是很难,它只是一次 3 件不同的事情。试着一次找出一个。
  • 至于分隔标记,更c++的方法是创建一个std::stringstream,然后在其上使用std::getline,它接受一个分隔符作为第二个参数。
  • 这能回答你的问题吗? How do I tokenize a string in C++?
  • 感谢您的输入,我现在可以制作令牌,但我真正的问题是如何将令牌解析为元组

标签: c++ string parsing lambda tuples


【解决方案1】:

解析数据的方法有很多种。您可以使用std::stringstreamfind 或其他。我相信您要问的问题是如何将值直接存储到元组中。为此,请使用std::get,它返回对元组中值的引用。

// Parameter s is the line to parse. Ex: "Dolly Davenell,8809903417,1 Toban Circle,Luozhou"
std::tuple<std::string, long, std::string, std::string> parse_line(std::string s)
{
    std::stringstream ss(s);
    std::tuple<std::string, long, std::string, std::string> t;

    if (std::getline(ss, std::get<0>(t), ',')) {
        if (ss >> std::get<1>(t)) {
            ss.ignore(1);  // Skip comma
            if (std::getline(ss, std::get<2>(t), ',') && std::getline(ss, std::get<3>(t))
                return t;
            }
        }
    }
    // throw here or handle error somehow
}

我将 int 更改为 long,因为示例中的值对于 32 位 int 来说太大了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2020-07-10
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多