有人能告诉我以下代码有什么问题吗?
__inline__
char* ut_byte_to_long (ulint nb) {
char* a = malloc(sizeof(nb));
int i = 0;
for (i=0;i<sizeof(nb);i++) {
a[i] = (nb>>(i*8)) & 0xFF;
}
return a;
}
然后使用strcat
将此字符串连接为较大字符串的一部分。字符串打印很好但是对于表示为字符符号的整数。我正在使用%s
和fprintf
来检查结果。
非常感谢。
修改
我接受了以下评论之一(我在调用\0
之前分别添加了终止fprintf
,但在strcat
之后。修改了我的初始函数...
__inline__
char* ut_byte_to_long (ulint nb) {
char* a = malloc(sizeof(nb) + 1);
int i = 0;
for (i=0;i<sizeof(nb);i++) {
a[i] = (nb>>(i*8)) & 0xFF;
}
a[nb] = '\0' ;
return a;
}
此示例代码仍未打印出数字......
char* tmp;
tmp = ut_byte_to_long(start->id);
fprintf(stderr, "Value of node is %s \n ", tmp);
答案 0 :(得分:4)
strcat
期望一个空字节终止字符串。
将您的malloc
尺寸更改为sizeof(nb) + 1
并将'\0'
追加到最后。
答案 1 :(得分:2)
你有两个问题。
第一个是字符数组a
包含数字,例如2
,而不是代表这些数字的ASCII代码,例如'2'
(= ASCII上的50,可能不同在其他系统中)。尝试将代码修改为
a[i] = (nb>>(i*8)) & 0xFF + '0';
第二个问题是上述计算的结果可以是0到255之间的任何值,换句话说,是需要多个数字才能打印的数字。
如果要打印十六进制数字(0-9,A-F),每次计算两位数就足够了,你可以编写类似
的内容a[2*i + 0] = int2hex( (nb>>(i*8)) & 0x0F ); //right hexa digit
a[2*i + 1] = int2hex( (nb>>(i*8+4)) & 0x0F ); //left hexa digit
,其中
char int2hex(int n) {
if (n <= 9 && n >= 0)
return n + '0';
else
return (n-10) + 'A';
}
答案 2 :(得分:1)
如果您不想使用sprintf(target_string,"%lu",source_int)
或非标准itoa()
,则此处是将long转换为字符串的函数版本:
__inline__
char* ut_byte_to_long (ulint nb) {
char* a = (char*) malloc(22*sizeof(char));
int i=21;
int j;
do
{
i--;
a[i] = nb % 10 + '0';
nb = nb/10;
}while (nb > 0);
// the number is stored from a[i] to a[21]
//shifting the string to a[0] : a[21-i]
for(j = 0 ; j < 21 && i < 21 ; j++ , i++)
{
a[j] = a[i];
}
a[j] = '\0';
return a;
}
我假设unsigned long包含少于21位数。 (最大数字是18,446,744,073,709,551,615,相当于2 ^ 64 - 1:20位数)