Преобразование int в строку в C

Я использую функцию itoa() для преобразования int в string, но она дает ошибку:

undefined reference to `itoa'
collect2: ld returned 1 exit status

В чем причина? Есть ли другой способ выполнить это преобразование?

Ответ 1

Используйте snprintf, он более переносимый, чем itoa.

itoa не является частью стандартного C и не является частью стандартного С++; но многие компиляторы и связанные с ним библиотеки поддерживают его.

Пример sprintf

char* buffer = ... allocate a buffer ...
int value = 4564;
sprintf(buffer, "%d", value);

Пример snprintf

char buffer[10];
int value = 234452;
snprintf(buffer, 10, "%d", value);

Обе функции похожи на fprintf, но вывод записывается в массив, а не в поток. Разница между sprintf и snprintf заключается в том, что snprintf гарантирует отсутствие переполнения буфера путем записи до максимального количества символов, которые могут быть сохранены в buffer.

Ответ 2

Прежде чем продолжить, я должен предупредить вас, что itoa НЕ является функцией ANSI - это не стандартная функция C. Вы должны использовать sprintf для преобразования int в строку.

itoa принимает три аргумента.

  • Первый представляет собой целое число, которое нужно преобразовать.
  • Второй - это указатель на массив символов - здесь будет храниться строка. Программа может произойти сбой, если вы передадите переменную char *, поэтому вы должны передать массив char в нормальном размере, и он будет работать нормально.
  • Последний не является размером массива, но это BASE вашего номера - base 10 - это тот, который вы, скорее всего, будете использовать.

Функция возвращает указатель на свой второй аргумент - где он сохранил преобразованную строку.

itoa - очень полезная функция, которая поддерживается некоторыми компиляторами - это позор, который не поддерживается всеми, в отличие от atoi.

Если вы все еще хотите использовать itoa, вот как вы должны его использовать. В противном случае у вас есть еще один вариант с использованием sprintf (если вы хотите получить выход 8, 10 или 16):

char str[5];
printf("15 in binary is %s\n",  itoa(15, str, 2));

Ответ 3

Используйте snprintf - он является стандартным для каждого компилятора. Запросите его для необходимого размера, называя его параметрами NULL, 0. Выделите один символ больше для нуля в конце.

int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);

Ответ 4

Обычно snprintf() - это путь:

char str[16]; // could be less but i'm too lazy to look for the actual the max length of an integer
snprintf(str, sizeof(str), "%d", your_integer);

Ответ 5

Вы можете создать свой собственный itoa с помощью этой функции:

void my_utoa(int dataIn, char* bffr, int radix){
int temp_dataIn;
temp_dataIn = dataIn;
int stringLen=1;

while ((int)temp_dataIn/radix != 0){
    temp_dataIn = (int)temp_dataIn/radix;
    stringLen++;
}
//printf("stringLen = %d\n", stringLen);
temp_dataIn = dataIn;
do{
    *(bffr+stringLen-1) = (temp_dataIn%radix)+'0';
    temp_dataIn = (int) temp_dataIn / radix;
}while(stringLen--);}

и это пример:

char buffer[33];
int main(){
  my_utoa(54321, buffer, 10);
  printf(buffer);
  printf("\n");

  my_utoa(13579, buffer, 10);
  printf(buffer);
  printf("\n");
}

Ответ 6

Лучше использовать sprintf(),

char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);

Ответ 7

void itos(int value, char* str, size_t size) {
    snprintf(str, size, "%d", value);
}

.. работает с вызовом по ссылке. Используйте его следующим образом:

int someIntToParse;
char resultingString[length(someIntToParse)];

itos(someIntToParse, resultingString, length(someIntToParse));

теперь resultingString будет содержать вашу C-строку.

Ответ 8

char string[something];
sprintf(string, "%d", 42);

Ответ 9

Аналогичная реализация Ахмаду Сироюддину, но немного отличающаяся семантика. С точки зрения безопасности, в любое время, когда функция записывает в строковый буфер, функция должна "знать" размер буфера и отказываться писать за его конец. Я бы предположил, что это часть причины, по которой вы больше не можете найти itoa.

Кроме того, следующая реализация позволяет избежать выполнения операции модуля/деления дважды.

char *u32todec( uint32_t    value,
                char        *buf,
                int         size)
{
    if(size > 1){
        int i=size-1, offset, bytes;
        buf[i--]='\0';
        do{
            buf[i--]=(value % 10)+'0';
            value = value/10;
        }while((value > 0) && (i>=0));
        offset=i+1;
        if(offset > 0){
            bytes=size-i-1;
            for(i=0;i<bytes;i++)
                buf[i]=buf[i+offset];
        }
        return buf;
    }else
        return NULL;
}

Следующий код проверяет приведенный выше код и демонстрирует его правильность:

int main(void)
{
    uint64_t acc;
    uint32_t inc;
    char buf[16];
    size_t bufsize;
    for(acc=0, inc=7; acc<0x100000000; acc+=inc){
        printf("%u: ", (uint32_t)acc);
        for(bufsize=17; bufsize>0; bufsize/=2){
            if(NULL != u32todec((uint32_t)acc, buf, bufsize))
                printf("%s ", buf);
        }
        printf("\n");
        if(acc/inc > 9)
            inc*=7;
    }
    return 0;
}

Ответ 10

см. этот пример

#include <stdlib.h> // for itoa() call
#include <stdio.h>  

int main() {
    int num = 145;
    char buf[5];

    // convert 123 to string [buf]
    itoa(num, buf, 10);

    // print our string
    printf("%s\n", buf);

    return 0;
}

см. ссылку с другими примерами.

Ответ 11

Как предложил Эдвин, используйте snprintf:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int n = 1234;
    char buf[10];
    snprintf(buf, 10, "%d", n);
    printf("%s\n", buf);
    return 0;
}

Ответ 12

Если вы действительно хотите использовать itoa, вам нужно включить стандартный заголовок библиотеки.

#include <stdlib.h>

Я также считаю, что если вы работаете в Windows (используя MSVC), то itoa на самом деле _itoa.

См. http://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx

И снова, поскольку вы получаете сообщение от collect2, скорее всего, вы используете GCC на * nix.