0

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

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

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

最佳解决方案

幸运的是,已经有人解决了上述所有问题。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;
} 

如果有人可以再解释一下,我认为这是我正在寻找的答案,我只是无法充分了解它的作用,以便我可以将这个想法应用于我的代码。

4

3 回答 3

1

使用strtol(和strtod双打)听起来是正确的方法。您引用的实现直接来自以下文档strtol

  • errno在调用之前设置为零(成功后strtol不会更改errno
  • errno在返回时检查strtol是否已发出错误信号
  • 最后一个条件检查输入是否为空,并且整个输入已被strtol.

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

于 2013-02-09T23:17:18.237 回答
1

作为学习练习,您可能想尝试自己编写此内容。我建议从一些例子开始。您可能希望首先牢牢掌握数字是如何以书面形式表示的。“42”是什么意思?换句话说,2代表什么,4代表什么?同样,“1000000”是什么意思?一旦掌握了这些概念,请写下将字符串转换为整数的步骤(英文)。从那里开始将其转换为代码。如果您在此过程中遇到任何问题,请随时回来提出更多问题。

于 2013-02-09T23:18:45.917 回答
0

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

strtol 的基础知识?

于 2013-02-10T04:21:53.077 回答