C语言中int到string的转换
我正在使用itoa函数将int转换为字符串,但它给出了一个错误:C语言中int到string的转换,c,C,我正在使用itoa函数将int转换为字符串,但它给出了一个错误: undefined reference to `itoa' collect2: ld returned 1 exit status 原因是什么?是否有其他方法执行此转换?使用snprintf,它比itoa更便于移植 );但是,许多编译器和相关的库都支持它 sprintf示例 snprintf示例 这两个函数类似于fprintf,但输出写入数组而不是流。sprintf和snprintf的区别在于,snprintf通过写入最多可存储
undefined reference to `itoa'
collect2: ld returned 1 exit status
原因是什么?是否有其他方法执行此转换?使用snprintf,它比itoa更便于移植
);但是,许多编译器和相关的库都支持它
sprintf示例
snprintf示例
这两个函数类似于fprintf,但输出写入数组而不是流。sprintf和snprintf的区别在于,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);
更好地使用sprintf
char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);
看这个例子
#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;
}
请看下面的例子 像Edwin建议的那样,使用snprintf:
如果您真的想使用itoa,则需要包含标准库标题
#include <stdlib.h>
我还相信,如果你在Windows上使用MSVC,那么itoa实际上就是itoa
看
另外,由于您从collect2收到一条消息,您很可能在*nix上运行GCC。在我继续之前,我必须警告您itoa不是ANSI函数-它不是标准的C函数。您应该使用sprintf将int转换为字符串 itoa有三个论点 第一个是要转换的整数。 第二个是指向字符数组的指针-这是存储字符串的位置。如果传入char*变量,程序可能会崩溃,因此应传入一个正常大小的char数组,它将正常工作。 最后一个不是数组的大小,而是数字的基数-基数10是最有可能使用的数字。 函数返回一个指向第二个参数的指针,该参数存储了转换后的字符串 itoa是一个非常有用的函数,它得到了一些编译器的支持——遗憾的是,与atoi不同,它没有得到所有编译器的支持 如果您仍然想使用itoa,下面是您应该如何使用它。否则,只要您希望以8、10或16为基数输出,就可以使用sprintf进行其他选择:
char str[5];
printf("15 in binary is %s\n", itoa(15, str, 2));
您可以使用此功能制作自己的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");
}
与…合作。像这样使用它,例如:
int someIntToParse;
char resultingString[length(someIntToParse)];
itos(someIntToParse, resultingString, length(someIntToParse));
现在resultingString将保存您的C-“字符串”。使用snprintf-它是每个编译器中可用的标准。通过使用NULL 0参数调用它来查询所需的大小。为结尾处的null多分配一个字符
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
与Ahmad Sirojuddin的实现类似,但语义稍有不同。从安全性的角度来看,每当函数写入字符串缓冲区时,该函数都应该真正知道缓冲区的大小,并拒绝超过缓冲区的结尾进行写入。我猜这是你再也找不到伊托亚的部分原因 此外,以下实现避免了执行两次模块/设备操作
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;
}
itoa函数未在ANSI-C中定义,因此某些平台默认情况下未实现 snprintf函数是itoa最容易的替代品。然而,整数到ascii函数可以作为整数到ascii转换问题的更好的整体解决方案 itoa的性能也优于snprintf,具体取决于实现。简化的itoa仅支持10个基数的实现,例如: 另一个完整的itoa实施如下: 另一个完整的itoa实施: 下面是一个itoa使用示例:
是的,我已经包括了stdlib.h,但是它的基石不工作。你能帮我举一些例子吗?现在你有一两个例子。sprintf和snprintf之间的另一个区别是它们在C89和更高版本中描述的sprintf标准;C99用于snprintf。值得注意的是,Windows库缺少snprintf函数,或者与标准描述的行为不同。在凌晨2:08保存了我。我的编译器遇到问题,因为它不支持itoa,呃,谢谢。snprintfputting“\0”到我的数组是最后一个元素吗?所以我可以知道它的结尾在哪里?50有点过分-即使是64位整数也不需要49个字符。您的sprintf callMinor中有一个输入错误:char stringNum[21];power2,63所需。我认为在这种情况下值得一提的是,对于新手和专业人士来说,使用固定缓冲区大小和sprintf被认为是不好的做法,也是导致内存损坏、安全问题/漏洞攻击和其他奇怪错误的最常见根源之一。如果可能的话,每当将字符串格式化为缓冲区时,始终使用SNPrTNF,并确保跟踪所使用的缓冲区的大小,也考虑尾随\ 0!看到这个链接,它有一些例子,这将只适用于十进制10转换。我很确定这将不会作为itoa工作,因为没有代码来处理以十进制10为基数的负数。
int someIntToParse;
char resultingString[length(someIntToParse)];
itos(someIntToParse, resultingString, length(someIntToParse));
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
char string[something];
sprintf(string, "%d", 42);
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 <stdbool.h>
#include <string.h>
// A utility function to reverse a string
char *reverse(char *str)
{
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
{
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
// Implementation of itoa()
char* itoa(int num, char* str, int base)
{
int i = 0;
bool isNegative = false;
/* Handle 0 explicitely, otherwise empty string is printed for 0 */
if (num == 0)
{
str[i++] = '0';
str[i] = '\0';
return str;
}
// In standard itoa(), negative numbers are handled only with
// base 10. Otherwise numbers are considered unsigned.
if (num < 0 && base == 10)
{
isNegative = true;
num = -num;
}
// Process individual digits
while (num != 0)
{
int rem = num % base;
str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0';
num = num/base;
}
// If number is negative, append '-'
if (isNegative)
str[i++] = '-';
str[i] = '\0'; // Append string terminator
// Reverse the string
reverse(str);
return str;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a=54325;
char buffer[20];
itoa(a,buffer,2); // here 2 means binary
printf("Binary value = %s\n", buffer);
itoa(a,buffer,10); // here 10 means decimal
printf("Decimal value = %s\n", buffer);
itoa(a,buffer,16); // here 16 means Hexadecimal
printf("Hexadecimal value = %s\n", buffer);
return 0;
}