这个C ++代码如何工作?

时间:2012-11-26 16:12:14

标签: c++ string parsing integer

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 ++编程方面,我不是很有经验。

5 个答案:

答案 0 :(得分:4)

代码使用strtol()进行解析。这是标准的C库函数。您可以在其他地方找到有关strtol()的文档:

strtol() man page on die.net

errno变量是由标准C库定义的特殊全局变量。如果函数遇到错误,则将其设置为错误代码。因此,当errno在例程开始时被赋值为零时,如果遇到错误,strtol()函数将为errno分配一个新值。以下if语句正在检查溢出和下溢错误情况。

char const *s参数是要解析的字符串。它是一个指向常量(只读)字符串的指针。按照惯例,字符串由NULL字节终止。

答案 1 :(得分:0)

每当我在C ++中完成字符串到int的转换时,我就使用了atoi方法。网上应该有很多适合你想做的事情

答案 2 :(得分:0)

errno是库提供的全局变量,strtol(以及其他库函数)用于指示错误条件。在上面的代码中,strtol可能会在用户将其设置为errno后更改0ERANGE确实是标准库提供的命名常量,它代表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”中定义的值。