Преобразование типов данных (без знака long long в char) - PullRequest
0 голосов
/ 17 декабря 2011

Может кто-нибудь сказать мне, что не так со следующим кодом?

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

Ответы [ 3 ]

4 голосов
/ 17 декабря 2011

strcat ожидает нулевого байта, оканчивающего строку.

Измените размер malloc на sizeof(nb) + 1 и добавьте '\0' в конец.

2 голосов
/ 17 декабря 2011

У вас две проблемы.

Во-первых, массив символов a содержит числа, такие как 2, вместо кодов ASCII, представляющих эти числа, таких как '2' (= 50 в ASCII, может отличаться в других системах).Попробуйте изменить свой код на

a[i] = (nb>>(i*8)) & 0xFF + '0';

Вторая проблема заключается в том, что результатом вышеприведенных вычислений может быть любое значение от 0 до 255, или, другими словами, число, для печати которого требуется более одной цифры.

Если вы хотите напечатать шестнадцатеричные числа (0-9, AF), достаточно двух цифр для такого вычисления, и вы можете написать что-то вроде

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';
}
1 голос
/ 17 декабря 2011

, если вы не хотите использовать 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;
}

Я предположил, что беззнаковые длинные содержат менее 21 цифры. (наибольшее число - 18 446 744 073 709 551 615, что равно 2 ^ 64 - 1: 20 цифр)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...