Перейти к содержимому
Tags

,

[pure C] Преобразование целого числа в строку

21.10.2010

Сегодня на stackoverflow.com был интересный вопрос:

I recently read a sample job interview question:

Write a function to convert an integer to a string. Assume you do not have access to library functions i.e., itoa(), etc…

How would you go about this?

Как же нам все таки преобразовать int в char* без использования каких-либо сторонних библиотек в том числе и stdlib?

Здесь я приведу свой вариант, а так же варианты которые предложили уважаемые поситители stackoverflow.com

Для начала мой вариант. Перед тем как его показать несколько слов о самом коде: Да он длинноват и в целом сотстоит из 3 функций:
— Получение длины строки
— Реверс строки
— Конвертация из int -> char*

Действительно давольный длинный и не тривиальный ход, но я думаю это будет полезно новичкам в Си. Сам код выглядит следующим образом:

static char*
itoa(int n, char s[])
{
    int i, sign;
    if ((sign = n) < 0)
        n = -n;
    i = 0;
    do
    {
      s[i++] = n % 10 + '0';
    } while ((n /= 10) > 0);   

    if (sign < 0)
        s[i++] = '-';

    s[i] = '\0';
    reverse(s);

    return s;
}

Далее как я уже говорил 2 фукцнии: реверс строки и получение длины строки:

 

int strlen(const char* str)
{
   int i = 0;
   while (str != '')
   {
       i++;
       str++;
   }

   return i;
}

static void
reverse(char s[])
{
    int i, j;
    char c;

    for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

Вот мое решение данной проблемы. Согласен не самое красивое, но имеет право на жизнь.

Посетители stackoverflow.com решили эту же проблему следующими способами:

char* itoa(int val, int base){

    static char buf[32] = {0};

    int i = 30;

    for(; val && i ; --i, val /= base)

        buf[i] = "0123456789abcdef"[val % base];

    return &buf[i+1];

}

Colored with dumpz.org

Следующий вариант:

int num = ...;
   char res[MaxDigitCount];
   int len = 0;
   for(; num > 0; ++len)
   {
      res[len] = num%10+'0';
      num/=10;
   }
   res[len] = 0; //null-terminating

   //now we need to reverse res
   for(int i = 0; i < len/2; ++i)
   {
       char c = res[i]; res[i] = res[len-i-1]; res[len-i-1] = c;
   }

Colored with dumpz.org

И последний вариант:

int n = INT_MIN;
char buffer[50];
int i = 0;

bool isNeg = n<0;

unsigned int n1 = isNeg ? -n : n;

while(n1!=0)
{
    buffer[i++] = n1%10+'0';
    n1=n1/10;
}

if(isNeg)
    buffer[i++] = '-';

buffer[i] = '';

for(int t = 0; t < i/2; t++)
{
    buffer[t] ^= buffer[i-t-1];
    buffer[i-t-1] ^= buffer[t];
    buffer[t] ^= buffer[i-t-1];
}

printf(buffer);

Colored with dumpz.org

А как бы данную проблему решили вы?

Реклама

From → C, coding

Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: