在提及的问题,答案在这里:我可以用这个方法,使该解决方案将是平台无关的。
char *buff = (char*) malloc(sizeof(unsigned long)*8);
sprintf(buff, "%lu", unsigned_long_variable);
在这里,我得到了缓冲区长度的值,因为它与无符号long变量相似。这种方法正确吗?
您想知道需要多少个字符才能表示最大的字符unsigned long
。正确的?
为此,您正在尝试计算最大可能值unsigned long
:
sizeof(unsigned long)*8
这在几种方面都是错误的。对于1,sizeof
返回的倍数char
,而不必是8位。您应该改为与CHAR_BIT
(from <limits.h>
)相乘。但这并不是必须的,因为相同的标头确实已经提供了最大的可能值UCHAR_MAX
。
然后,您就犯了一个错误:您的计算给出了以位为单位的整数表示的大小。您想要的是以字符为单位的字符串表示形式的大小。这可以通过(from )函数来实现:unsigned long
log10()
<math.h>
log10( UCHAR_MAX )
这将为您提供一个double
值,该值指示中的(十进制)位数UCHAR_MAX
。这将是一小部分,你需要一轮向上(1)(ceil()
做这行你)。
因此:
#include <math.h>
#include <stdlib.h>
#include <limits.h>
int main()
{
char * buff = malloc( ceil( log10( UCHAR_MAX ) ) + 1 );
//...
}
总而言之,这是很狡猾的(我在写出来的时候犯了两个错误,可耻的是我-如果您在使用时犯了错误,可耻的是您)。而且,您需要将数学库用于snprintf( NULL, ... )
可以更轻松地为您完成的工作,如所链接的“问答”所示。
(1):log10( 9999 )
给出3.9999565...
了4个数字号码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句