C ++ базовое преобразование - PullRequest
5 голосов
/ 12 июля 2010

Здравствуйте, я пытаюсь перенести код из Windows в Linux. У меня есть это:

itoa(word,aux,2);

Но GCC не признает Итоа. Как я могу сделать это преобразование в базу 2 на C ++ пути?

Спасибо;)

Ответы [ 5 ]

2 голосов
/ 12 июля 2010

Здесь´ s некоторая помощь

/* itoa:  convert n to characters in s */
 void itoa(int n, char s[])
 {
     int i, sign;

     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
 }

Вы должны адаптировать ее к вашим потребностям (обратите внимание, что у этого есть 2 аргумента, а не 3). Также обратите внимание, что обратная функция также есть вссылка на википедию.

Кроме того, здесь - некоторые другие случаи (но не для базы 2)

Эта функция не определена в ANSI-C и не являетсячасть C ++, но поддерживается некоторыми компиляторами.

Стандартной альтернативой для некоторых случаев может быть sprintf:

sprintf(str,"%d",value) преобразуется в десятичную базу.

sprintf(str,"%x",value) преобразуется в шестнадцатеричное основание.

sprintf(str,"%o",value) преобразуется в восьмеричное основание.

1 голос
/ 12 июля 2010

как насчет boost :: lexical_cast ???

http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm

1 голос
/ 12 июля 2010

Вот ответ Тома, модифицированный для использования базы в соответствии с требованиями вашего кода:

void itoa(int n, char s[], std::size_t base = 10) {
    const char digits[] = "0123456789abcdef";
    int i, sign;

    if (base < 2 || base > 16)
        throw std::invalid_argument("invalid base");
    if ((sign = n) < 0)  /* record sign */
        n = -n;      /* make n positive */
    i = 0;
    do {       /* generate digits in reverse order */
        s[i++] = digits[n % base]; /* get next digit */
    } while ((n /= base) > 0);         /* delete it */
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}
1 голос
/ 12 июля 2010

Здесь есть страница реализации itoa здесь

0 голосов
/ 27 мая 2014

Как насчет использования силы рекурсии? :)

int convert_base(int v, int b){ 

    if (v == 0) return 0;   
    else 
        return (v%b+10*convert_base(v/b,b));    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...