是否存在类似于strtol的标准C函数,它将采用char *和非空终止字符串的长度?
我知道我可以将字符串复制到以null结尾的区域,但出于效率原因这是不可取的。
感谢。
答案 0 :(得分:4)
标准库中没有此类功能。您将不得不使用临时缓冲区方法,或从头开始编写自己的函数。
答案 1 :(得分:3)
回答你的问题:不,没有标准功能,但写起来很简单:
#include <stdio.h>
#include <ctype.h>
int natoi(char *s, int n)
{
int x = 0;
while(isdigit(s[0]) && n--)
{
x = x * 10 + (s[0] - '0');
s++;
}
return x;
}
int main(int argc, char*argv[])
{
int i;
for(i = 1; i < argc; i++)
printf("%d: %d\n", i, natoi(argv[i], 5));
}
答案 2 :(得分:2)
strntol可能就是你所追求的......但它不是标准的C.
答案 3 :(得分:1)
如果
但是:只需要复制一份;你可能有一个字符串可以有多长的上限(一个适合 这是一个粗略的(未经测试的,浏览器编写的)起点:long
的十进制数字在其最大长度上有一个严格的上限),所以你可以有一个静态缓冲区。然后分析整个应用程序,看看复制/转换是否真的是一个瓶颈。如果真的如此,那么你知道你需要自己编写。long limited_strtol(const char *string, size_t len)
{
long sign = 1;
long value = 0;
for(; len > 0 && *string == '-'; string++, len--)
sign *= -1;
for(; len > 0 && isdigit(*string); string++, len--)
{
value *= 10;
value += *string - '0';
len--;
string++;
}
return sign * value;
}