如何将unsigned long转换为字符串

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

例如,如果我有sprintf(buffer, format, value) ,如何使用与平台无关的方式确定缓冲区的大小?

 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); 

标准方法是使用sprintf(buffer, "%lu", value); 写一个字符串rep valuebuffer 。 但是,溢出是一个潜在的问题,因为sprintf会愉快地(并且在不知不觉中)写入缓冲区的末尾。

这实际上是sprintf的一大弱点,通过使用流而不是缓冲区在C ++中部分修复。 通常的“答案”是分配一个非常大的缓冲区,不太可能溢出,让sprintf输出到那个,然后用strlen来确定生成的实际字符串长度,calloc是一个缓冲区(那个大小+ 1)并将字符串复制到那个。

该网站在一定程度上讨论了这个问题和相关问题。

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

你可以编写一个从unsigned 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 buffer [50]; unsigned long a = 5; int n=sprintf (buffer, "%lu", a); 

尝试使用sprintf

 unsigned long x=1000000; char buffer[21]; sprintf(buffer,"%lu", x); 

编辑:

请注意,您必须提前分配一个缓冲区,并且在您这样做时不知道数字实际存在多长时间。 我假设32位long ,可以产生大到10位的数字。

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

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

作为可用选项的参考,请参阅sprintf

 #include  int main () { unsigned long lval = 123; char buffer [50]; sprintf (buffer, "%lu" , lval ); }