数据类型转换(unsigned long long to char)

时间:2011-12-16 23:30:05

标签: c parsing tree type-conversion

有人能告诉我以下代码有什么问题吗?

__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将此字符串连接为较大字符串的一部分。字符串打印很好但是对于表示为字符符号的整数。我正在使用%sfprintf来检查结果。

非常感谢。

修改

我接受了以下评论之一(我在调用\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);

3 个答案:

答案 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位数)