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 == ERANGE是否将errno分配给0? (ERANGE是一个特殊值吗?)
其次,参数列表中的“char const * s”是什么意思?
PS:在C ++编程方面,我不是很有经验。
答案 0 :(得分:4)
代码使用strtol()进行解析。这是标准的C库函数。您可以在其他地方找到有关strtol()的文档:
errno变量是由标准C库定义的特殊全局变量。如果函数遇到错误,则将其设置为错误代码。因此,当errno在例程开始时被赋值为零时,如果遇到错误,strtol()函数将为errno分配一个新值。以下if语句正在检查溢出和下溢错误情况。
char const *s
参数是要解析的字符串。它是一个指向常量(只读)字符串的指针。按照惯例,字符串由NULL字节终止。
答案 1 :(得分:0)
每当我在C ++中完成字符串到int的转换时,我就使用了atoi方法。网上应该有很多适合你想做的事情
答案 2 :(得分:0)
errno
是库提供的全局变量,strtol
(以及其他库函数)用于指示错误条件。在上面的代码中,strtol
可能会在用户将其设置为errno
后更改0
。 ERANGE
确实是标准库提供的命名常量,它代表strtol
用来指示超出范围错误的一些特殊值。
您的char const *s
问题太模糊了。具体你不明白的是什么? const
部分意味着不允许str2int
内的用户代码修改s
指向的字符串。编译器将尽力阻止对s
指向的字符串进行任何修改(或可能修改)操作。
答案 3 :(得分:0)
这里的大多数特殊性都是errno
,而不是与之比较的值。
errno
是一些全局,被一些(特别是较旧的)库函数用来发出错误信号。你给它分配0(这隐含意味着没有问题)。然后,如果它遇到问题,库函数可以为它分配一些非零值,告诉你想要出错。
在调用库函数之后,通常检查1)它是否现在为非零,2)如果是,它具有什么值。根据已分配的值,您可以对出现的错误类型做出反应。
但是,我应该补充一点,errno
的许多用法大部分都是不可移植的。 C标准表示存在errno
,没有库函数将0分配给errno
,但不是更多。它没有指定任何特定函数可以赋给它的非零值(嗯,它指定某些某些函数指定的非零值,但不限制分配给那些值或那些功能)。
答案 4 :(得分:0)
首先,这显然是C ++伪装的C程序。
strtol
是标准C库中的一个函数,它可以完成实际工作。可以在那里访问它的doumentation:http://linux.die.net/man/3/strtol
所有其他事情都只是预赛和检查。
errno
是来自C库的特殊全局变量,可以通过标准函数进行修改,以便设置适当的错误代码(是的,它是C遗留的,这不是线程安全的)。其值可以设置为标准头“errno.h”中定义的值。