我知道这是一个重复的问题,我已经看了很多答案,但到目前为止还没有人真正帮助过我。
我需要能够将各种字符串传递给两个方法,一个返回一个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;
}
如果有人能够解释一下,我认为这是我正在寻找的答案我只是无法掌握它的作用,以便我可以将这个想法应用到我的代码中。
答案 0 :(得分:1)
使用strtol
(和strtod
表示双打)听起来像是正确的做法。您引用的实现直接来自strtol
的文档:
errno
设置为零(strtol
成功时不会更改errno
)errno
返回时检查strtol
以查看是否已发出错误信号strtol
消耗了整个输入。 double
的实现看起来是一样的,除了你使用strtod
。
答案 1 :(得分:1)
作为一项学习练习,您可能想尝试自己编写。我建议从一些例子开始。您可能希望首先牢牢掌握数字在写作中的表现方式。 “42”是什么意思?换句话说,2代表什么,4代表什么?同样,“1000000”是什么意思?一旦掌握了这些概念,请记下将字符串转换为整数所需的步骤(英文)。从那里开始将其转换为代码。如果你在途中被困在任何地方,请随时回答更多问题。
答案 2 :(得分:0)
我在另一个地方重写了这个问题,最后得到了我正在寻找的答案。对于任何想知道的链接: