【问题标题】:C++ - error while using atoiC++ - 使用 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

【问题讨论】:

标签: c++ atoi


【解决方案1】:

这就是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 块。

【讨论】:

    【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多