字符串流分析逗号分隔的整数

Stringstream parse comma-separated integers

本文关键字:分隔 整数 字符串      更新时间:2023-10-16

伙计们, 实际上我想在这里做的是,当我输入 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;
}

在最后一个数字上,while 循环失败,因为末尾没有字符。只是字符串的末尾。因此,它不会在循环中执行push_back。

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

我改为在您的main中使用getline.我将您的循环索引更改为 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;
}

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

另请参阅: getline, stoi