分割逗号分隔的字符串

时间:2018-10-07 15:08:55

标签: c++ string vector

c ++的新手,即时消息很难在字符串上拆分。我已经在堆栈溢出中看到了一些这样的示例,但是在for循环中循环时,我无法使示例工作。

基本上,我有一个看起来像字符串的数组。

    const string userData[] =
   {"A1,John,Smith,smithJ@mail.com,42",
   "B2,Jane,Doe,jd@gmailcom,121,2",
   "C3,Mickey,Mouse,mouseman@mail.com,20"
   };   

下面是我自己最接近解决方案的地方

 string s;
 vector<istringstream> streamV;
 vector<string> stringV;
 for(const auto& str : userData)
 {
      istringstream nasa { str };
      getline(nasa, s, ',');
      stringV.push_back(s);

 }
 cout << stringV[0] << endl;
 cout << stringV[1] << endl;

输出

A1
B1

期望的目标: 我想将每个逗号分隔的值添加到向量中。 然后,调出类构造函数,对从字符串到int的最后一个值进行内联类型转换。

编辑1 我了解我的问题类似于The most elegant way to iterate the words of a string 主要区别在于,提供的解决方案不适用于以逗号分隔的列表,并且无法遍历数组/向量。

3 个答案:

答案 0 :(得分:2)

尝试以下代码段:

int main()
{
    vector<string> sentences =
    { "A1,John,Smith,smithJ@mail.com,42",
        "B2,Jane,Doe,jd@gmailcom,121,2",
        "C3,Mickey,Mouse,mouseman@mail.com,20"
    };

    vector<string> results;

    for (auto words : sentences) {
        stringstream  ss(words);
        string str;
        while (getline(ss, str, ',')) {
            results.push_back(str);
        }
    }

    //display result
    for (auto word : results) {
        cout << word << '\n';
    }

    return 0;
}

答案 1 :(得分:0)

尝试使用此功能:

std::vector<std::string> split(const std::string& s, char delimiter)                                                                                                                          
{                                                                                                                                                                                             
   std::vector<std::string> splits;                                                                                                                                                           
   std::string split;                                                                                                                                                                         
   std::istringstream ss(s);                                                                                                                                                                  
   while (std::getline(ss, split, delimiter))                                                                                                                                                 
   {                                                                                                                                                                                          
      splits.push_back(split);                                                                                                                                                                
   }                                                                                                                                                                                          
   return splits;                                                                                                                                                                             
}

然后将其命名为:

auto userSplitData = split(userData[0], ',');

答案 2 :(得分:0)

您可能已经对建议的解决方案感到满意,但是如果您想要更多面向STL的内容,请查看以下内容:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main()
{
    const std::vector<std::string> inputs = {
        "A1,John,Smith,smithJ@mail.com,42",
        "B2,Jane,Doe,jd@gmailcom,121,20",
        "C3,Mickey,Mouse,mouseman@mail.com,2"
    };
    std::vector<std::string> output;

    for(const auto& in : inputs)
    {
        auto it = std::begin(in);
        while (true)
        {
            auto commaPosition = std::find(it, std::end(in), ',');
            output.emplace_back(it, commaPosition);
            if (commaPosition == std::end(in))
            {
                break;
            }
            it = std::next(commaPosition);
        }
    }
    for (const auto& out : output)
    {
        std::cout << out  << std::endl;
    }
    return 0;
}