C++ - 使用 atoi 时出错
Posted
技术标签:
【中文标题】C++ - 使用 atoi 时出错【英文标题】:C++ - error while using atoi 【发布时间】:2012-11-20 10:07:01 【问题描述】:我正在尝试使用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
?
【问题讨论】:
atoi
将string
转换为int
。不是你说的int
到string
。
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::stol
和 std: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_argument
或 std::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 时出错