C ++ - 从std :: string解析数字

时间:2017-06-14 05:01:33

标签: c++

我需要遍历购物清单,我已将其放入向量中,并进一步按数量和项目名称分隔每一行。如何将数字作为第一项并将项目名称作为第二项?

示例:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  Group 1:
  <input type="radio" name="ans1" str="ans_a" value="1" />
  <input type="radio" name="ans1" str="ans_b" value="2" />
  <input type="radio" name="ans1" str="ans_c" value="3" />
  <input type="radio" name="ans1" str="ans_d" value="4" /> Group 2:
  <input type="radio" name="ans2" str="ans_a" value="1" />
  <input type="radio" name="ans2" str="ans_b" value="2" />
  <input type="radio" name="ans2" str="ans_c" value="3" />
  <input type="radio" name="ans2" str="ans_d" value="4" /> Group 3:
  <input type="radio" name="ans3" str="ans_a" value="1" />
  <input type="radio" name="ans3" str="ans_b" value="2" />
  <input type="radio" name="ans3" str="ans_c" value="3" />
  <input type="radio" name="ans3" str="ans_d" value="4" />


</form>

我不确定这个数字有多大,所以我不能使用常量索引。

理想情况下,我想要成对的矢量。

3 个答案:

答案 0 :(得分:4)

您可以编写一个功能来分割数量和项目,如下所示:

#include <sstream>

auto split( const std::string &p ) {
    int num;
    std::string item;

    std::istringstream  ss ( p);
    ss >>num ; // assuming format is integer followed by space then item
    getline(ss, item); // remaining string
    return make_pair(num,item) ;
}

然后使用std::transform获取对的向量:

std::transform( shopping_list.cbegin(),
                   shopping_list.cend(),
                   std::back_inserter(items), 
                   split );

See Here

答案 1 :(得分:1)

您可以按如下方式使用std::stringstream

vector< pair<int,string> > myList;
for(int i=0;i<shopping_list.size();i++) {
    int num;
    string item;
    std::stringstream ss;
    ss<<shopping_list[i];
    ss>>num;
    ss>>item;
    myList.push_back(make_pair(num,item));
    ...
}

num是您需要的号码。

答案 2 :(得分:0)

我建议您使用以下解决方案而不使用stringstream作为替代解决方案

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    vector<string> shopping_list = { "3 Apples", "5 Mandarin Oranges", "24 Eggs", "152 Chickens" };
    vector< pair<int, string> > pairs_list;

    for (string s : shopping_list)
    {
        int num;
        string name;
        int space_pos = s.find_first_of(" ");
        if (space_pos == std::string::npos)
            continue; // format is broken : no spaces

        try{
            name = s.substr(space_pos + 1);
            num = std::stoi(s.substr(0, space_pos));
        }
        catch (...)
        {
            continue; // format is broken : any problem
        }
        pairs_list.push_back(make_pair(num, name));
    }

    for (auto p : pairs_list)
    {
        cout << p.first << " : " << p.second << endl;
    }

    return 0;
}