将int转换为c中的string

我正在使用itoa()函数来将int转换为string但它给出了一个错误

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

有人可以告诉我原因吗? 有没有其他的方式来执行此转换?

使用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类似,但是输出写入数组而不是stream。 sprintfsnprintf的区别在于, snprintf通过写入最多可以存储在buffer的字符来保证没有缓冲区溢出。

在我继续之前,我必须警告你itoa不是一个ANSI函数 – 它不是一个标准的C函数。 您应该使用sprintfint转换为string。

itoa有三个论点。

  • 第一个是要转换的整数。
  • 第二个是指向字符数组的指针 – 这是string要存储的位置。 程序可能会崩溃,如果你传递一个char *variables,所以你应该传递一个正常大小的字符数组,它会正常工作。
  • 最后一个不是数组的大小,但它是你的数字的BASE – 基数10是最有可能使用的数字。

该函数返回一个指向第二个参数的指针 – 它存储转换后的string。

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来实现这个function:

 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); 

像Edwinbuild议的那样,使用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的消息,你很可能在* nix上运行GCC。

看到这个例子

 #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; } 

看到这个链接有其他的例子。

 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)); 

现在resultingStringstring将保存你的Cstring“。

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

艾哈迈德Sirojuddin类似的实现,但略有不同的语义。 从安全的angular度来看,任何时候一个函数写入string缓冲区,函数应该真正“知道”缓冲区的大小,并拒绝写入结束。 我猜想它是你找不到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; } 

下面的代码都testing了上面的代码并且certificate了它的正确性:

 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; }