我正在编写一个程序,我将获得一个字符串,如:
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;
}
答案 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;
}
警告:以前的代码未编译也未经过测试