C++ - 使用 atoi 时出错

Posted

技术标签:

【中文标题】C++ - 使用 atoi 时出错【英文标题】:C++ - error while using atoi 【发布时间】:2012-11-20 10:07:01 【问题描述】:

我正在尝试使用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

【问题讨论】:

atoistring 转换为int。不是你说的intstring How do I tell if the c function atoi failed or if it was a string of zeros?的可能重复 【参考方案1】:

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

C++11 引入了std:stoi,这是安全的,因为如果输入以某种方式无效,它会抛出异常。还有其他两个变体:std::stolstd:stoll。有关详细信息,请参阅在线文档:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

int int_value = boost::lexical_cast<int>(string_value);

【讨论】:

以上是关于C++ - 使用 atoi 时出错的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用 TEXT() 函数 windows.h 时出错

尝试在 Python 3 中使用 C++ 类时出错

使用 pybind11 包装 C++ 抽象类时出错

尝试在 C++ 中使用 glDrawArrays 时出错

使用 emscripten 将 c++ 文件转换为 wasm 时出错

C++:使用函数为二维数组分配内存时出错