在C中将int转换为字符串

时间:2011-03-09 07:15:53

标签: c

我正在使用itoa()函数将int转换为string,但却出错了:

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

是什么原因?还有其他方法可以执行此转换吗?

13 个答案:

答案 0 :(得分:69)

使用snprintf,它比itoa更便携。

itoa is not part of standard C, nor is it part of standard 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,但输出被写入数组而不是流。 sprintfsnprintf之间的区别在于snprintf通过写入可以存储在buffer中的最大字符数来保证没有缓冲区溢出。

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

更好地使用sprintf(),

char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);

答案 3 :(得分:4)

使用snprintf - 它是每个编译器都可以使用的标准配置。通过使用NULL, 0参数调用它来查询所需的大小。最后为一个字符分配空值。

int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);

答案 4 :(得分:3)

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

答案 5 :(得分:3)

您可以使用此功能制作自己的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");
}

答案 6 :(得分:2)

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

答案 7 :(得分:1)

void itos(int value, char* str, size_t size) {
    snprintf(str, size, "%d", value);
}

..适用于call by reference。像这样使用它:

int someIntToParse;
char resultingString[length(someIntToParse)];

itos(someIntToParse, resultingString, length(someIntToParse));

现在resultingString将保留您的C - '字符串'。

答案 8 :(得分:1)

类似于Ahmad Sirojuddin的实现,但语义略有不同。从安全角度来看,只要函数写入字符串缓冲区,该函数就应该“知道”缓冲区的大小并拒绝写入它的末尾。我猜它是你再也找不到itoa的部分原因了。

此外,以下实现避免了两次执行模块/ devide操作。

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

答案 9 :(得分: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;
}

请参阅此link其他示例。

答案 10 :(得分:0)

与Edwin建议的一样,使用 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;
}

答案 11 :(得分:0)

如果确实想要使用itoa,则需要包含标准库标题。

#include <stdlib.h>

我也相信如果您使用的是Windows(使用MSVC),那么itoa实际上是_itoa

请参阅http://msdn.microsoft.com/en-us/library/yakksftt(v=VS.100).aspx

然后,再次,由于您收到来自collect2的消息,您可能会在* nix上运行GCC。

答案 12 :(得分:0)

itoa()函数未在ANSI-C中定义,因此在某些平台(Reference Link)中默认未实现。

s(n)printf()函数是itoa()的最简单替换。但是,itoa(整数到ascii)函数可以用作整数到ascii转换问题的更好的整体解决方案。

根据实现的不同,

itoa()的性能也优于s(n)printf()。以简化的itoa(仅支持10基数)实现为例:Reference Link

Reference Link)下面是另一个完整的itoa()实现:

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

另一个完整的itoa()实现:Reference Link

下面(Reference Link)的itoa()用法示例:

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