【发布时间】:2012-11-14 03:44:36
【问题描述】:
enum STR2INT_ERROR { SUCCESS, OVERFLOW, UNDERFLOW, INCONVERTIBLE };
STR2INT_ERROR str2int (int &i, char const *s, int base = 0)
{
char *end;
long l;
errno = 0;
l = strtol(s, &end, base);
if ((errno == ERANGE && l == LONG_MAX) || l > INT_MAX) {
return OVERFLOW;
}
if ((errno == ERANGE && l == LONG_MIN) || l < INT_MIN) {
return UNDERFLOW;
}
if (*s == '\0' || *end != '\0') {
return INCONVERTIBLE;
}
i = l;
return SUCCESS;
}
我正在尝试编写一个程序,该程序可以将从文件中读取的字符串解析为整数值。在寻找执行此操作的方法时,我在 stackoverflow 帖子上找到了上面的这段代码:
How to parse a string to an int in C++?
但是,我无法理解它是如何工作的。 具体来说,如果 errno 被赋值为 0,程序员为什么要检查 errno == ERANGE? (ERANGE 是特殊值吗?)
其次,参数列表中的“char const *s”是什么意思?
PS:我对 C++ 编程不是很有经验。
【问题讨论】:
-
1.因为
strtol可以改变errno。 2.阅读指针。 3. 更喜欢boost::lexical_cast之类的东西,这是一个单行和可能的例外。 -
这是 C。这样的标记可能会有所帮助。
-
@ahenderson 你是对的,但最初的问题被标记为 C++。此外,从
char const*的问题中,我收集到 OP 确实在尝试使用 C++,而不是 C。 -
@chris - 问题中的链接明确指出为什么不使用 boost::lexical_cast 并提出合理的观点。并不是我说不要使用它。
-
@DumbCoder,虽然我同意它背后的逻辑,但我知道只有一种情况它不能满足您的要求(确保读取了整个缓冲区),所以分开因此,这是一个非常有用的解决方案。
标签: c++ string parsing integer