Я использую функцию itoa()
для преобразования int
в string
, но она дает ошибку:
undefined reference to `itoa'
collect2: ld returned 1 exit status
В чем причина? Есть ли другой способ выполнить это преобразование?
Я использую функцию itoa()
для преобразования int
в string
, но она дает ошибку:
undefined reference to `itoa'
collect2: ld returned 1 exit status
В чем причина? Есть ли другой способ выполнить это преобразование?
Используйте 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
.
Прежде чем продолжить, я должен предупредить вас, что itoa
НЕ является функцией ANSI - это не стандартная функция C. Вы должны использовать sprintf
для преобразования int
в строку.
itoa
принимает три аргумента.
char *
, поэтому вы должны передать массив char в нормальном размере, и он будет работать нормально.Функция возвращает указатель на свой второй аргумент - где он сохранил преобразованную строку.
itoa
- очень полезная функция, которая поддерживается некоторыми компиляторами - это позор, который не поддерживается всеми, в отличие от atoi
.
Если вы все еще хотите использовать itoa
, вот как вы должны его использовать. В противном случае у вас есть еще один вариант с использованием sprintf
(если вы хотите получить выход 8, 10 или 16):
char str[5];
printf("15 in binary is %s\n", itoa(15, str, 2));
Используйте snprintf
- он является стандартным для каждого компилятора. Запросите его для необходимого размера, называя его параметрами NULL, 0
. Выделите один символ больше для нуля в конце.
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
Обычно 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);
Вы можете создать свой собственный 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");
}
Лучше использовать sprintf(),
char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);
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-строку.
char string[something];
sprintf(string, "%d", 42);
Аналогичная реализация Ахмаду Сироюддину, но немного отличающаяся семантика. С точки зрения безопасности, в любое время, когда функция записывает в строковый буфер, функция должна "знать" размер буфера и отказываться писать за его конец. Я бы предположил, что это часть причины, по которой вы больше не можете найти 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;
}
см. этот пример
#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;
}
см. ссылку с другими примерами.
Как предложил Эдвин, используйте 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;
}
Если вы действительно хотите использовать itoa, вам нужно включить стандартный заголовок библиотеки.
#include <stdlib.h>
Я также считаю, что если вы работаете в Windows (используя MSVC), то itoa
на самом деле _itoa
.
См. http://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx
И снова, поскольку вы получаете сообщение от collect2
, скорее всего, вы используете GCC на * nix.