Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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 如何将无符号长字符串转换为字符串_C - Fatal编程技术网

C 如何将无符号长字符串转换为字符串

C 如何将无符号长字符串转换为字符串,c,C,在C语言中,如何将unsigned long值转换为字符串(char*),并保持源代码的可移植性,或者只是重新编译以在其他平台上工作(无需重写代码) 例如,如果我有sprintf(缓冲区、格式、值),我如何以平台无关的方式确定缓冲区的大小?尝试使用sprintf: char buffer [50]; unsigned long a = 5; int n=sprintf (buffer, "%lu", a); unsigned long x=1000000; char buffer[21];

在C语言中,如何将unsigned long值转换为字符串(char*),并保持源代码的可移植性,或者只是重新编译以在其他平台上工作(无需重写代码)


例如,如果我有
sprintf(缓冲区、格式、值)
,我如何以平台无关的方式确定缓冲区的大小?

尝试使用
sprintf

char buffer [50];

unsigned long a = 5;

int n=sprintf (buffer, "%lu", a);
unsigned long x=1000000;
char buffer[21];
sprintf(buffer,"%lu", x);
编辑:

请注意,您必须提前分配缓冲区,并且不知道这样做时数字的实际长度。我假设32位
long
s,它可以生成10位数的数字


请参阅Carl Smotricz的答案,以更好地解释所涉及的问题。

对于长值,您需要为无符号十进制整数添加长度信息'l'和'u'

有关可用选项的参考,请参见

#包括
int main()
{
无符号长lval=123;
字符缓冲区[50];
sprintf(缓冲区,“%lu”,lval);
}

标准方法是使用
sprintf(buffer,“%lu”,value);
value
的字符串表示写入
buffer
。然而,溢出是一个潜在的问题,因为
sprintf
将愉快地(不知不觉地)写入缓冲区的末尾


这实际上是SpaFTF的一大弱点,它部分地用流而不是缓冲区固定在C++中。通常的“答案”是分配一个非常不太可能溢出的缓冲区,让SavaTFF输出到那个,然后使用StrLLN确定实际的字符串长度,CaloC缓冲区(那个大小+ 1)。并将字符串复制到该位置

详细讨论了这一点和相关问题


一些库提供了
snprintf
作为一种替代方案,允许您指定最大缓冲区大小。

您可以编写一个函数,将无符号long转换为str,类似于ltostr库函数

char *ultostr(unsigned long value, char *ptr, int base)
{
  unsigned long t = 0, res = 0;
  unsigned long tmp = value;
  int count = 0;

  if (NULL == ptr)
  {
    return NULL;
  }

  if (tmp == 0)
  {
    count++;
  }

  while(tmp > 0)
  {
    tmp = tmp/base;
    count++;
  }

  ptr += count;

  *ptr = '\0';

  do
  {
    res = value - base * (t = value / base);
    if (res < 10)
    {
      * -- ptr = '0' + res;
    }
    else if ((res >= 10) && (res < 16))
    {
        * --ptr = 'A' - 10 + res;
    }
  } while ((value = t) != 0);

  return(ptr);
}
char*ultostr(无符号长值,char*ptr,int-base)
{
无符号长t=0,res=0;
无符号长tmp=值;
整数计数=0;
if(NULL==ptr)
{
返回NULL;
}
如果(tmp==0)
{
计数++;
}
而(tmp>0)
{
tmp=tmp/基础;
计数++;
}
ptr+=计数;
*ptr='\0';
做
{
res=值-基*(t=值/基);
如果(res<10)
{
*--ptr='0'+res;
}
否则,如果((res>=10)和(&(res<16))
{
*——ptr='A'-10+res;
}
}而((值=t)!=0);
返回(ptr);
}

您可以参考我的博客,其中用示例说明了实现和使用。

使用sprintf,如何使用平台无关的方法确定缓冲区的大小manner@Walidix答案可能是限制。h:这实际上是SaaFrTF的一大弱点,部分是用流而不是缓冲区固定在C++中。通常的“答案”。就是分配一个不太可能溢出的缓冲区,让sprintf输出到该缓冲区,然后使用
strlen
确定产生的实际字符串长度,
calloc
一个缓冲区(该大小+1),并将字符串复制到该缓冲区。@Walidix:您需要计算
log10(ULONG_MAX)
…一个简单的答案是
snprintf
,如果你有它的话。请参阅我的答案了解更多细节。是的,我会使用
snprintf
。这是标准的,它为完全解决这个问题提供了支持。与你的坟墓相矛盾,+1表示健康。打印一个数字是一种不需要
snprintf
的情况;你可以很容易地找到答案nd所需缓冲区的大小。(使用
%s
oth打印,这需要小心。)许多程序员会觉得用
snprintf
指定一个非常明确的上界比考虑数字的大小在数学上建立这样的上界更好,或者更糟糕的是,他们会摆弄对数来预先计算这个大小。注意VLA(
char buf[n+1];
)需要C992014,我仍然坚持使用VisualStudio在Windows开发中不允许这样做:(极好的答案,一个要面对那些认为没有困难就不能完成的人,除非你使用C++。我在看着你,Carl Smotricz!!
const int n = snprintf(NULL, 0, "%lu", ulong_value);
assert(n > 0);
char buf[n+1];
int c = snprintf(buf, n+1, "%lu", ulong_value);
assert(buf[n] == '\0');
assert(c == n);
char *ultostr(unsigned long value, char *ptr, int base)
{
  unsigned long t = 0, res = 0;
  unsigned long tmp = value;
  int count = 0;

  if (NULL == ptr)
  {
    return NULL;
  }

  if (tmp == 0)
  {
    count++;
  }

  while(tmp > 0)
  {
    tmp = tmp/base;
    count++;
  }

  ptr += count;

  *ptr = '\0';

  do
  {
    res = value - base * (t = value / base);
    if (res < 10)
    {
      * -- ptr = '0' + res;
    }
    else if ((res >= 10) && (res < 16))
    {
        * --ptr = 'A' - 10 + res;
    }
  } while ((value = t) != 0);

  return(ptr);
}