C ++将字符串转换为冗长字符串中的整数

时间:2014-03-26 17:33:54

标签: c++

我正在编写一个程序,我将获得一个字符串,如:

5,6,10

我已经创建了一个程序,它接受数字5 6 10(忽略逗号)并将它们放入向量中。 我的程序唯一的问题是,如果我做了像

这样的事情

5,6,F

它会将f变为0.而我希望程序只报告错误,如果它看到的只是一个0 1 2 3 4 5 6 7 8 9,

如何修复程序来执行此操作?这是我的代码:

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


int main()
{
    string str, temp;

    cout << "enter string: \n";
    getline (cin, str);
    vector<int> vec;
    int num;

    for (int j=0; j < str.size(); j++)
{
    int num2= str.size()-1;

    if (isdigit(str[j]))
    {
        temp+= str[j];
        num = atoi(temp.c_str());
        if (num2 ==j)  //if program is at end of string and it's still a number
            vec.push_back(num); //push back value
    }
    else if (str[j] == ',')
    {
        num = atoi(temp.c_str());
        temp.clear();
        vec.push_back(num);

    }
    else
    {
        cout << "error\n";
        temp.clear();
    }

}
    for (int k=0; k < vec.size(); k++)
        cout << vec[k] <<endl;
}

1 个答案:

答案 0 :(得分:0)

使用atoi并不安全,请改用strtol

来自atoi的文档:

  

如果str没有指向有效的C字符串,或者转换后的值   它会超出int可表示的值范围,它会导致   未定义的行为。

示例:

// ...

char *end;
long int res = strtol(str, &end, 10);
if (str == eptr) {
    throw std::invalid_argument("invalid strtol argument");
}
if (errno == ERANGE) {
    throw std::out_of_range("strtol argument out of range");
} 

更新:您的代码应如下所示:

char *iter = str.c_str(); // your str
char *end;
while ( *iter ) {
    int res = strtol(iter, &end, 10);

    // not a number, skip it and continue with the next one
    if (iter == end) {
        iter++;
        cout << "error: " << *iter << endl;
        continue;
    }

    // handle the out-of-range error
    if (errno == ERANGE) {
        cout << "overflow: " << string(iter, end) << endl;
    } else {
        // number is valid
        vec.push_back(res);
    }

    // continue iterating, skip char at (*end) since it's not an integer
    iter = end + 1;
}

警告:以前的代码未编译也未经过测试