使用“ stringstream”

时间:2018-10-07 11:41:20

标签: c++

我正在尝试使用stringstream将数据字符串转换为整数(以用于某些计算),但是如果有空格,它将失败。

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

int main() {
    string line;
    vector <string>data;

    for (int i = 0; i < 10;i++) {
        getline(cin,line);
        data.push_back(line);
    }

    ///converting digits to int
    vector<int> values;
    int n;
    char ch=',';
    for (int i = 0; i < data.size();i++) {     
        stringstream stream(data[i]);

        while( stream >>n ) {
            if(stream >> ch) {
                values.push_back(n);
            }
            else {
                values.push_back(n);
            }
            cout<<n<<" ";
         }
         cout<<endl;
    }
    return 0;
} 

输入:1,182,08 51 15->输出:1 182 8 1 5 空格后会丢失一些数字。
因此,我该如何避免呢?

3 个答案:

答案 0 :(得分:0)

根据seccpur的答案完成工作代码。 Visual Studio 2017社区:

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

using namespace std;

#define BUFSZ 100 // Set max size of the numbers as a single string
int convertToIntegers(char *s, vector<int> &values);

int main()
{
    int count;
    int i;
    char data[BUFSZ];
    vector<int> values;

    strcpy_s(data, "1,182,08 51 15");
    count = convertToIntegers(data, values);

//  for (auto val : values) // Show the result
//      cout << val << '\n';
// *** OR ***
    for (i = 0; i < count; i++)
        cout << values[i] << '\n';

}
//////////////////////////////////////
// Convert a C string to integers
//
int convertToIntegers(char *s, vector<int> &values)
{
    vector<string> numbers;
    char *next_token;

    char* ptr = strtok_s(s, " -.,;", &next_token);
    while (ptr)
    {
        string str(ptr);
        numbers.push_back(str);
        ptr = strtok_s(NULL, " -.,;", &next_token); // Next number
    }
    //
    // Convert the resulting strings to integers
    //
    for (auto str : numbers)
        values.push_back(stoi(str));
    return (int)values.size();
}

答案 1 :(得分:0)

如果您知道只有一个字符作为分隔符,一个空格或一个逗号,则以下代码将起作用:

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

int main() {
string line;
vector <string>data;

for (int i = 0; i < 10;i++) {
    getline(cin,line);
    data.push_back(line);
}

///converting digits to int
vector<int> values;
int n;
char ch=',';
for (int i = 0; i < data.size();i++) {     
    stringstream stream(data[i]);

    while( stream >>n ) {
        char c = stream.get();
        //if(stream >> ch) {
        //    values.push_back(n);
        //}
        //else {
            values.push_back(n);
        //}
        cout<<n<<" ";
     }
     cout<<endl;
}
return 0;

}

答案 2 :(得分:-1)

您在输入中使用了多个定界符(例如空白:,;-),这使事情变得复杂。这是一个可能使用std::strtok的代码段:

    //Enter a line 
    string line;
    getline(cin, line);

    // Convert string to char* so that std::strtok could be used later
    char *cstr = new char[line.length() + 1];
    std::strcpy(cstr, line.c_str());
    vector<string> words;

    // split line into multiple strings using multiple delimiters
    char* ptr = std::strtok(cstr, " -.,;");
    while (ptr)
    {
        string str(ptr);
        words.push_back(str);
        ptr = strtok(NULL, " -.,;");
    }
    delete[] cstr;

    // Convert string to int
    vector<int> values;
    for (auto str : words){
        values.push_back(std::stoi(str));
    }
    // Print the values
    for (auto val : values){
        cout << val << '\n';
    }