Исходный код во встроенном C для целого числа без знака в строке - PullRequest
2 голосов
/ 03 августа 2011

Не прибегая к стандартной библиотеке UTOA, я ищу исходный код UTOA, чтобы я мог настроить его для конкретного проекта.У меня есть целое число без знака (32 бита) с выводом, например 0xFFFF_FFFF

Я также ищу исходный код для целого числа без знака и половину слова в строку в двоичном формате.

Ответы [ 6 ]

5 голосов
/ 03 августа 2011

Попробуйте:

char *dec(unsigned x, char *s)
{
    *--s = 0;
    if (!x) *--s = '0';
    for (; x; x/=10) *--s = '0'+x%10;
    return s;
}

Вы вызываете его с указателем на end буфера, предоставленного вызывающей стороной, и функция возвращает указатель на начало строки.Для безопасности буфер должен иметь длину не менее 3*sizeof(int)+1.

Конечно, это легко адаптировать к другим базам.

3 голосов
/ 03 августа 2011

Theres много исходных файлов itoa, которые легко найти в Google ... Италия из opensource.apple.com

Или напишите с нуля, это не так уж сложно.

1 голос
/ 09 февраля 2016

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

Так что использование деления на 10 - это единственный видный вариант, который я думаю. Вот оно:

/*for byte which is 3 digit most*/


void itoa(unsigned char value,char *desitination)
{
desitination[0] = '\0';
desitination[1] = '\0';
desitination[2] = '\0';
desitination[3] = '\0';//you at least 4 char array, last char is NULL
while (value >= 100)
{
    desitination[0]++;
    value -= 100;
}
desitination[1] = '0';

while (value >= 10)
{
     desitination[1]++;
     value -= 10;
}
value+= '0';
desitination[2] =value;
}
1 голос
/ 03 августа 2011
#include <stdint.h>
#include <string.h>

char * utox(uint32_t n) {
    static char hexstr[sizeof(n)*2+1];
    char * p = hexstr + sizeof(hexstr) -1;
    int x;

    memset(hexstr, '0', sizeof(hexstr));

    *p-- = '\0';

    while (n) {
        x = n % 16;
        if (x < 10)
            *p-- = '0' + x;
        else
            *p-- = 'A' + x - 10;

        n /= 16;
    }

    return hexstr;
}

Это должно сделать это, это ноль колодок. Простое изменение типа n в параметрах функции заставит его работать для любого целочисленного типа / размера.

1 голос
/ 03 августа 2011

Это не очень сложно.Продолжайте делить на 10 и используйте оставшийся мод 10 в качестве индекса в «0123455679».Вы строите это справа налево, поэтому вы должны буферизовать результат и вернуть его в обратном порядке:

char * utoa(unsigned int n)
{
  char * res, buf[30]; // long enough for largest number
  unsigned int i, counter = 0;

  if (n == 0)
    buf[counter++] = '0';

  for ( ; n; n /= 10)
    buf[counter++] = "0123456789"[n%10];

  res = malloc(counter);

  for (i = 0; i < counter; ++i)
    res[i] = buf[counter - i - 1];

  return res;
}
0 голосов
/ 22 ноября 2016

Есть много реализаций итоа. Это один из них, который принимает во внимание базу от 2 до 36:

/**
 * C++ version 0.4 char* style "itoa":
 * Written by Lukás Chmela
 * Released under GPLv3.

 */
char* itoa(int value, char* result, int base) {
    // check that the base if valid
    if (base < 2 || base > 36) { *result = '\0'; return result; }

    char* ptr = result, *ptr1 = result, tmp_char;
    int tmp_value;

    do {
        tmp_value = value;
        value /= base;
        *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)];
    } while ( value );

    // Apply negative sign
    if (tmp_value < 0) *ptr++ = '-';
    *ptr-- = '\0';
    while(ptr1 < ptr) {
        tmp_char = *ptr;
        *ptr--= *ptr1;
        *ptr1++ = tmp_char;
    }
    return result;
}

Больше вариантов можно найти здесь , что включает в себя быстродействие различных реализаций.

...