Stringstream解析以逗号分隔的整数

时间:2018-01-30 19:13:14

标签: c++ vector while-loop iostream stringstream

所以伙计们,其实我想在这里做的是当我输入3,12,36时输出将是:

  

3
  12个
  36

但是我在如何输出所有答案方面遇到了困难。我一直在做的是当你输入3,12,36时它只会输出3 12,如果输入3,12,36,48,它将输出3 12 36.

所以它总会错过最后一个整数,因为我的while循环不正确。但如果我把它改成

while(output >> life|| output >> ch)

它也不起作用。我做了很多研究,但它仍让我感到困惑,我仍然坚持这一部分。

vector<int> parseInts(string str) {//23,4,56
    vector<int>lifeishard;
    stringstream output;
    string lifeisgood = str;
    output.str(lifeisgood);
    int life;
    char ch;
    while(output >> life >> ch){
       lifeishard.push_back(life);
       //lifeishard.push_back(life2);
       //lifeishard.push_back(life3);   
    }
    return lifeishard;
}

int main() {
    string str;
    cin >> str;
    vector<int> integers = parseInts(str);
    for(int i = 0; i < integers.size(); i++) {
        cout << integers[i] << "\n";
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

在你的最后一个号码上,while循环失败,因为最后没有字符。只是字符串的结尾。所以它不会在循环内执行push_back。

更改它以便while循环只获取数字。然后在循环中执行push_back。然后在循环中,在推送之后,获取逗号字符。不要检查获取逗号的失败,因为当它再次绕过while循环时它会失败并退出。

我更改为使用getline中的main。我将循环索引更改为size_t,因为混合有符号和无符号整数绝不是一个好主意,每当您使用size()函数时,它都是size_t。在发布你的程序时,它应该包含所有内容。我修复了你的程序版本:

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

using namespace std;

vector<int> parseInts(string str) {//23,4,56
    vector<int>lifeishard;
    stringstream output;
    string lifeisgood = str;
    output.str(lifeisgood);
    int life;
    char ch;
    while(output >> life){
        lifeishard.push_back(life);
        output >> ch;
    }
    return lifeishard;
}

int main() {
    string str;
    getline(cin, str);
    vector<int> integers = parseInts(str);
    for(size_t i = 0; i < integers.size(); i++) {
        cout << integers[i] << "\n";
    }
    // Here is how we do for loops over containers in modern C++
    for(auto x: integers) {
        cout << x << '\n';
    }

    return 0;
}

答案 1 :(得分:0)

stringstreamgetline 与分隔符和 stoi 的组合足以进行转换:

来自带有分隔符的 getline 的 C++ 参考:

<块引用>

从 is 中提取字符并将它们存储到 str 中,直到找到分隔符 delim 为止。

考虑到这一点,下面的代码示例假设输入格式正确:

示例

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

using namespace std;

vector<int> parseInts(const string& str, const char delim = ',')
{
    vector<int> parsed;
    stringstream ss(str);
    string s;
    while (getline(ss, s, delim)) // <- stores input in s upon hitting delimiter
        parsed.push_back(stoi(s)); // <-- convert string to int and add it to parsed
    return parsed;
}

int main()
{
    string str = "3,12,36"; // <-- change to cin if you'd like
    vector<int> ints = parseInts(str); 
    for (auto& i : ints)
        cout << i << "\n";
}

输出

3
12
36

查看更多:getlinestoi