将length(非NULL终止)指定的字符串转换为int / float?

时间:2012-03-09 08:53:06

标签: c string

  

可能重复:
  Is there a strtol equivalent that does not require a null-terminated string?
  strtod with limited string length   

我正在尝试将c'字符串'转换为各种c数字类型:int,float,long int ...我所拥有的'字符串'不是'\ 0'终止字符,但我有每个字符串的长度,所以我必须将字符复制到缓冲区,在末尾添加'\ 0',然后使用atoi或strtol ...

是否有一些lib /函数已经实现了以下功能?

strToInt(char *str, int str_len)

strToFloat(char *str, int str_len)

4 个答案:

答案 0 :(得分:3)

根据定义,C字符串以null结尾的char缓冲区。否则那些不是C字符串。

我想说最简单的方法,如果你有一个不是C字符串的缓冲区 - 将其转换为字符串,并使用标准函数(atoi等)。通常它甚至不需要分配更多内存,而只需要分配当前字符串的副本。

答案 1 :(得分:1)

也许甚至不打扰图书馆。在整数的情况下,自己很容易做到:

int str2int(const char* str, int len)
{
    int i;
    int ret = 0;
    for(i = 0; i < len; ++i)
    {
        ret = ret * 10 + (str[i] - '0');
    }
    return ret;
}

对于浮点数和双精度数,可以对积分部分使用相同的代码,然后使用一个循环,将每个连续字符的影响减少10倍。

额外的工作带来了你想要添加的所有花里胡哨 - 负数(我没有打扰示例代码中的那些,但它们很容易添加),科学记数法,有效性检查等 - 但是一旦你决定坐下来做这件事并不难。

希望有所帮助!

答案 2 :(得分:1)

由于在您的使用案例中,似乎非空终止字符串作为较大字符串(紧跟该数字后面的非数字字符)的一部分存在,您可以使用strtol和{{1原样。它们会在到达数字末尾时自动停止,实际上如果你要求它们,它们会给你指向下一个字符的指针。

如果数字后面的缓冲区中的数据不是更多文本,或者它可能会嵌入后续数字字符中,请问自己是否可以确定数据是否可写并且当您没有被任何其他线程读取时正在处理它。如果是这样,只需备份以下字符并将其替换为空字符,调用strtodstrtol,然后恢复您覆盖的字符。

如果所有其他方法都失败了,请使用strtod(POSIX,或自己滚动)制作一个C字符串的副本。如果您知道长度是有界的,则可以避免分配,只需将其复制到本地自动数组变量中即可。

答案 3 :(得分:0)

您可以使用memcpy将所需的字节数从源缓冲区复制到dest缓冲区,并手动附加\0,这将使字节序列成为字符串,然后将其传递给{ {1}},atoi(和家人)。为什么不简单地将null终止字节序列而不是将其复制到中间缓冲区?