C ++ - 使用atoi时出错

时间:2012-11-20 10:07:01

标签: c++ atoi

我正在尝试使用atoi函数来获得从stringint的转换。问题是我有一个包含整数和字符串值的字符串数组。

从我读过的内容来看,为了从中获取错误代码,函数必须返回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

4 个答案:

答案 0 :(得分:14)

这就是atoi使用不安全的原因。如果输入无效,它不会检测并通知程序。

C ++ 11引入了std:stoi这是安全的,因为如果输入在某种程度上无效,它会抛出异常。还有另外两种变体:std::stolstd: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_argumentstd::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);