12

我正在尝试使用该atoi函数来获得从stringto的转换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

4

4 回答 4

19

这就是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取决于引发的原因。catch如果您希望它们以不同方式处理,您可以只编写两个块。

于 2012-11-20T10:09:23.367 回答
2

已经有很好的答案推荐 std::stoi 和 boost::lexical_cast 的 C++ API。

atoi() 是一个 C API,甚至在 C 中也被破坏了,因为除了成功解析为零之外,您无法分辨失败。如果您正在编写 C,如果您关心错误,请改用 strtol() 和朋友,因为它会在 ERRNO 中带外报告错误。

于 2012-11-20T10:45:34.430 回答
1

因为里面的数字001_是1,为什么要返回0呢?如果您只想处理一个字符,只需使用isdigit(s[0])and s[0]-'0'。如果您想更好地检查错误以查看字符串中有多少包含数字,请使用strtol.

于 2012-11-20T10:09:09.817 回答
0

atoi 有点老了……在 boost lib“词法转换”中有一个更好的替代品。

char * str = boost::lexical_cast<std::string>(int_value);

或者

int int_value = boost::lexical_cast<int>(string_value);
于 2012-11-20T10:26:16.877 回答