是否存在strtol等价物,不需要以空字符结尾的字符串?

是否存在类似于strtol的标准C函数,它将采用char *和非空终止字符串的长度?

我知道我可以将字符串复制到以null结尾的区域,但出于效率原因这是不可取的。

谢谢。

标准库中没有这样的function。 您将需要使用临时缓冲区方法,或从头开始编写自己的函数。

回答你的问题:不,没有标准function,但编写自己的function很简单:

#include  #include  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)); } 

strntol可能就是你所追求的……但它不是标准的C.

如果你的效率很高,你可能会激发你自己编写和调试的时间。

但是:只需要复制一份; 你可能有一个字符串可以有多长的上限(一个十进制数字适合一个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; }