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

Posted

技术标签:

【中文标题】将字符串转换为整数或双精度数【英文标题】:Converting strings to ints or doubles 【发布时间】:2013-02-09 23:09:32 【问题描述】:

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

我需要能够将各种字符串传递给两个方法,一个返回一个双精度值,另一个返回一个整数值。 主要问题是我需要对这两种方法进行严格的错误检查,以便如果我传递一个不包含数字且仅包含数字的字符串,则该方法不会进行转换。正如我所说,我已经看到了一些解决方案,但我看到的唯一一个好的解决方案(能够遵循)是使用我不想使用的 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;
 

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

【问题讨论】:

您希望解释哪一部分? C++11 有added some functions for this。 【参考方案1】:

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

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

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

【讨论】:

我还是不知道怎么称呼它。我不知道中间的peram是什么。我需要做的是这样的字符串输入; int 示例 = strtol(input,?,0) @JamesThompson 第一个指针明显指向输入的开头;返回时,第二个参数指向的指针将被设置为输入字符串中输入的消耗部分已结束的位置。如果第二个参数指向原始字符串的空终止符,则您知道所有输入都已被消耗。【参考方案2】:

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

【讨论】:

【参考方案3】:

我在另一个地方重新措辞了这个问题,终于得到了我正在寻找的答案。如果有任何疑问,请点击以下链接:

Basics of strtol?

【讨论】:

以上是关于将字符串转换为整数或双精度数的主要内容,如果未能解决你的问题,请参考以下文章

可以采用整数或浮点数或双精度数或任何其他可转换为浮点数的 C++ 函数

mariadb/mysql:如何将 BLOB 的/UNPACK 部分转换为整数或双精度等

错误使用 .* 整数只能与同一类的整数或双精度标量组合

将字符串从.csv文件转换为双精度数

Java:将双精度数转换为字符串

[C/C++笔面试]不使用库函数将字符串转换为整数