我正在尝试使用atoi
函数来获得从string
到int
的转换。问题是我有一个包含整数和字符串值的字符串数组。
从我读过的内容来看,为了从中获取错误代码,函数必须返回0:
string s = "ssss";
int i = atoi(s.c_str())
if (i == 0)
cout<<"error"<<endl;
end;
如果我的字符串值为0
,我该怎么办?
另一个问题是这个字符串:string s = "001_01_01_041_00.png"
。 atoi
函数返回值1
。它不应该返回0
。为什么返回1
?
答案 0 :(得分:14)
这就是atoi
使用不安全的原因。如果输入无效,它不会检测并通知程序。
C ++ 11引入了std:stoi
这是安全的,因为如果输入在某种程度上无效,它会抛出异常。还有另外两种变体:std::stol
和std:stoll
。有关详细信息,请参阅在线文档:
您的代码将变为:
try {
string s = "ssss";
int i = std::stoi(s); //don't call c_str()
//if (i == 0) no need to check!
std::cout << i << endl;
}
catch(std::exception const & e)
{
cout<<"error : " << e.what() <<endl;
}
请注意,e
的运行时类型可以是std::invalid_argument
或std::out_of_range
,具体取决于throw的原因。如果你希望它们以不同的方式处理,你可以写两个catch
块。
答案 1 :(得分:2)
建议使用std :: stoi和boost :: lexical_cast的C ++ API已经有了很好的答案。
atoi()是一个C API,即使在C语言中也是如此,因为除了成功的零解析之外你无法分辨失败。如果您正在编写C,请使用strtol()和朋友,如果您关心错误,因为它会在ERRNO中报告带外情况。
答案 2 :(得分:0)
因为001_
中的数字是1,为什么它会返回0?如果您只想处理一个字符,请使用isdigit(s[0])
和s[0]-'0'
。如果您想要更好的错误检查以查看字符串中包含多少数字,请使用strtol
。
答案 3 :(得分:0)
atoi有点老......在升级lib“lexical cast”中有一个更好的替代品。
char * str = boost::lexical_cast<std::string>(int_value);
或
int int_value = boost::lexical_cast<int>(string_value);