11

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

我知道我可以将字符串复制到一个空终止区域,但出于效率原因,这是不可取的。

谢谢。

4

4 回答 4

4

标准库中没有这样的功能。您要么必须使用临时缓冲区方法,要么从头开始编写自己的函数。

于 2009-07-06T08:42:58.967 回答
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));
}
于 2009-07-06T08:48:40.733 回答
2

strntol可能是您所追求的……不过,它不是标准的 C。

于 2009-07-06T08:42:35.550 回答
1

如果您对效率如此迫切,您可能会花时间编写和调试自己的代码。

但是:只需复制一份即可;您可能对字符串的长度有一个上限(适合 a 的十进制数字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;
}
于 2009-07-06T08:48:24.837 回答