将字符串转换为整数或双精度数

时间:2013-02-09 23:09:33

标签: c++ string int type-conversion

我知道这是一个重复的问题,我已经看了很多答案,但到目前为止还没有人真正帮助过我。

我需要能够将各种字符串传递给两个方法,一个返回一个double,另一个返回一个int。 主要的问题是我需要对这两种方法进行严格的错误检查,这样如果我传递一个不包含数字的字符串,只有一个数字,那么该方法不会进行转换。正如我所说,我已经看到了一些解决方案,但我见过的唯一一个好的解决方案(能够遵循)是使用我不想使用的Boost。至于我在这里无法回答的答案是从

复制的一部分

How to parse a string to an int in C++?

最佳解决方案

幸运的是,有人已经解决了上述所有问题。 C标准库包含strtol和系列,没有这些问题。

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;
} 

如果有人能够解释一下,我认为这是我正在寻找的答案我只是无法掌握它的作用,以便我可以将这个想法应用到我的代码中。

3 个答案:

答案 0 :(得分:1)

使用strtol(和strtod表示双打)听起来像是正确的做法。您引用的实现直接来自strtol的文档:

  • 在通话前将errno设置为零(strtol成功时不会更改errno
  • 它会在errno返回时检查strtol以查看是否已发出错误信号
  • 最终条件检查输入是否为空,并且strtol消耗了整个输入。

double的实现看起来是一样的,除了你使用strtod

答案 1 :(得分:1)

作为一项学习练习,您可能想尝试自己编写。我建议从一些例子开始。您可能希望首先牢牢掌握数字在写作中的表现方式。 “42”是什么意思?换句话说,2代表什么,4代表什么?同样,“1000000”是什么意思?一旦掌握了这些概念,请记下将字符串转换为整数所需的步骤(英文)。从那里开始将其转换为代码。如果你在途中被困在任何地方,请随时回答更多问题。

答案 2 :(得分:0)

我在另一个地方重写了这个问题,最后得到了我正在寻找的答案。对于任何想知道的链接:

Basics of strtol?