C 是否将由长度(不是以NUL结尾)指定的字符串转换为int/float?

C 是否将由长度(不是以NUL结尾)指定的字符串转换为int/float?,c,string,C,String,可能重复: 我正在尝试将c‘字符串’转换为各种c数字类型:int、float、long int。。。我拥有的“字符串”不是以“\0”结尾的字符,但每个字符串都有长度,因此我必须将字符复制到缓冲区中,将“\0”添加到末尾,然后使用atoi或strtol 是否有一些库/函数已经实现了如下功能 strToInt(char *str, int str_len) strToFloat(char *str, int str_len) 根据定义,C字符串是以null结尾的字符缓冲区。否则这些不是C字符

可能重复:

我正在尝试将c‘字符串’转换为各种c数字类型:int、float、long int。。。我拥有的“字符串”不是以“\0”结尾的字符,但每个字符串都有长度,因此我必须将字符复制到缓冲区中,将“\0”添加到末尾,然后使用atoi或strtol

是否有一些库/函数已经实现了如下功能

strToInt(char *str, int str_len)

strToFloat(char *str, int str_len)

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


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

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

可能根本不需要使用库。在整数情况下,您自己就可以轻松完成:

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;
}
int str2int(const char*str,int len)
{
int i;
int-ret=0;
对于(i=0;i
对于浮点数和双精度浮点,可以对整型部分使用相同的代码,然后使用一个循环,将每个连续字符对十进制位的影响减少十倍

额外的工作伴随着所有你想要添加的铃铛和口哨——负数(我在示例代码中没有涉及负数,但它们很容易添加)、科学记数法、有效性检查等等——但一旦你决定坐下来做,这并不是那么难


希望这会有所帮助!

因为在您的使用案例中,非空终止字符串似乎作为较大字符串的一部分存在(紧跟数字后面的非数字字符),您可能只需按原样使用
strtol
strtod
。当它们到达数字的末尾时,它们会自动停止,事实上,如果您要求,它们会给您下一个字符的指针

如果数字后面的缓冲区中的数据不是进一步的文本,或者可能会与后续的数字字符冲突,请自问是否可以确保数据是可写的,并且在处理数据时不会被任何其他线程读取。如果可以,只需备份以下字符并将其替换为空字符,请调用
strtol
strtod
,然后恢复您改写的字符


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

也许我应该说将C字符转换为数字类型,但你知道我试图定义什么,如果字符串不是NUL终止的,那么它们就不是C字符串;-)请不要关门。这个问题与潜在的重复问题非常不同,因为需要增加浮点运算(没有简单的“滚动自己的”解决方案)。“字符串”只是指向大c字符串中数字的字符串表示形式的指针,因此它们的末尾没有“\0”。显然,我可以将字符复制到缓冲区中,但似乎不需要太多的中间步骤。标准函数不提供这样的接口,也许您可以动态分配所需的缓冲区数量,空终止它,将其传递给strtol,将缓冲区释放到最低限度,您可以在堆栈上创建缓冲区,以避免分配!的确如果任何程序员发现自己在不到10分钟的时间内写这类非常基本的东西有困难,我强烈建议为初学者找一本好的C编程书……转换浮点数是非常重要的,而您的算法是错误的。像这样的事情“自己滚”几乎肯定是个坏主意。只需
strndup
strtod
it。