Преобразование int в строку в C - PullRequest
33 голосов
/ 09 марта 2011

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

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

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

Ответы [ 12 ]

69 голосов
/ 09 марта 2011

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

itoa не является частью стандарта C и не является частью стандарта 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.

6 голосов
/ 15 июня 2014

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

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

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

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

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

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

char str[5];
printf("15 in binary is %s\n",  itoa(15, str, 2));
4 голосов
/ 28 сентября 2015

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

int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
4 голосов
/ 09 марта 2011

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

char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);
3 голосов
/ 11 июля 2015

Вы можете сделать свой собственный 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");
}
3 голосов
/ 09 марта 2011

Обычно 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);
2 голосов
/ 02 февраля 2016
char string[something];
sprintf(string, "%d", 42);
1 голос
/ 24 июля 2017

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

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

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;
}
1 голос
/ 17 июля 2015
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-'строку'.

0 голосов
/ 09 марта 2011

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

#include <stdlib.h>

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

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

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

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