将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。 sprintf
和snprintf
的区别在于, snprintf
通过写入最多可以存储在buffer
的字符来保证没有缓冲区溢出。
在我继续之前,我必须警告你itoa
不是一个ANSI函数 – 它不是一个标准的C函数。 您应该使用sprintf
将int
转换为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));
现在resultingString
string将保存你的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; }