Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否存在不需要以null结尾的字符串的strtol等价物?_C_String_Std - Fatal编程技术网

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

C 是否存在不需要以null结尾的字符串的strtol等价物?,c,string,std,C,String,Std,是否有一个类似于strtol的标准C函数,它将接受字符*和非空终止字符串的长度 我知道我可以将字符串复制到以null结尾的区域,但出于效率原因,这是不可取的 谢谢。可能就是你想要的。。。不过,它不是标准的C。标准库中没有这样的函数。您将不得不使用临时缓冲区方法,或者从头开始编写自己的函数。如果您迫切需要提高效率,您可能会抽出时间编写和调试自己的函数 但是:只要复印一份就行了;您可能对字符串的长度有一个上限(适合long的十进制数字对其最大长度有一个严格的上限),因此可以使用静态缓冲区。然后分析整

是否有一个类似于strtol的标准C函数,它将接受字符*和非空终止字符串的长度

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


谢谢。

可能就是你想要的。。。不过,它不是标准的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;
}

回答您的问题:不,没有标准函数,但它非常简单,可以编写自己的函数:

#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));
}
#包括
#包括
int natoi(字符*s,int n)
{
int x=0;
而(isdigit(s[0])&&n--)
{
x=x*10+(s[0]-“0”);
s++;
}
返回x;
}
int main(int argc,char*argv[])
{
int i;
对于(i=1;i
您应该先转换为
无符号字符
,然后再转换为
isdigit
您好,我来自未来。您是否相信10年后,仍然没有标准解决方案不需要将字符串复制到临时缓冲区?还记得《辛普森一家》2000年播出的特朗普担任美国总统的那一集吗?你不会相信如果我告诉你…@ USE15938,如果你愿意使用C++标准库,是一个像样的解决方案。