1
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 帖子上找到了上面的这段代码:

如何在 C++ 中将字符串解析为 int?

但是,我无法理解它是如何工作的。具体来说,如果 errno 被赋值为 0,程序员为什么要检查 errno == ERANGE?(ERANGE 是特殊值吗?)

其次,参数列表中的“char const *s”是什么意思?

PS:我对 C++ 编程不是很有经验。

4

5 回答 5

4

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

die.net 上的 strtol() 手册页

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

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

于 2012-11-26T16:22:59.900 回答
0

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

于 2012-11-26T16:19:08.980 回答
0

errno是库提供的全局变量,strtol(以及其他库函数)用于指示错误情况。在上面的代码strtolerrno,用户将其设置为0. ERANGE确实是标准库提供的一个命名常量,它代表一些特殊的值,用来strtol表示超出范围的错误。

你的char const *s问题太模糊了。你具体有什么不明白的?该const部分表示str2int不允许里面的用户代码修改 指向的字符串s。编译器将尽最大努力防止对指向的字符串进行任何修改(或可能修改)操作s

于 2012-11-26T16:19:52.300 回答
0

这里的大部分特殊性是 with errno,而不是被比较的值。

errno是一些(尤其是较旧的)库函数用来发出错误信号的全局变量。您将 0 分配给它(这隐含意味着没有问题)。然后,如果它遇到问题,库函数可以为其分配一些非零值来告诉你想要出错。

在调用库函数之后,您通常会检查 1) 它现在是否非零,以及 2) 如果是,它具有什么值。根据分配的值,您可以对出现的错误类型做出反应。

但是,我应该补充一点,许多用途errno大多是不可移植的。C 标准说errno存在,没有库函数将 0 分配给errno,但仅此而已。它没有指定任何特定函数可以分配给它的非零值(好吧,它指定了某些函数分配的一些非零值,但不限制对这些值或那些函数的分配)。

于 2012-11-26T16:20:31.810 回答
0

首先,这显然是一个伪装成 C++ 的 C 程序。

strtol是标准 C 库中的一个函数,它执行实际工作。它的文档可以在那里访问:http: //linux.die.net/man/3/strtol

所有其他事情都只是初步和检查。

errno是 C 库中的一个特殊全局变量,可以由标准函数修改以设置适当的错误代码(是的,它是 C 遗留的,这不是线程安全的)。它的值可以设置为标准头文件“errno.h”中定义的值。

于 2012-11-26T16:21:50.773 回答