如何在C中将整数转换为字符串?

如何在C中将整数转换为字符串?,c,string,integer,type-conversion,C,String,Integer,Type Conversion,我试过这个例子: /* itoa example */ #include <stdio.h> #include <stdlib.h> int main () { int i; char buffer [33]; printf ("Enter a number: "); scanf ("%d",&i); itoa (i,buffer,10); printf ("decimal: %s\n",buffer);

我试过这个例子:

/* itoa example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int i;
    char buffer [33];
    printf ("Enter a number: ");
    scanf ("%d",&i);
    itoa (i,buffer,10);
    printf ("decimal: %s\n",buffer);
    itoa (i,buffer,16);
    printf ("hexadecimal: %s\n",buffer);
    itoa (i,buffer,2);
    printf ("binary: %s\n",buffer);
    return 0;
}
/*举个例子*/
#包括
#包括
int main()
{
int i;
字符缓冲区[33];
printf(“输入一个数字:”);
scanf(“%d”、&i);
itoa(i,缓冲器,10);
printf(“十进制:%s\n”,缓冲区);
itoa(i,缓冲器,16);
printf(“十六进制:%s\n”,缓冲区);
itoa(i,缓冲器,2);
printf(“二进制文件:%s\n”,缓冲区);
返回0;
}

但是这个例子不起作用(它说函数
itoa
不存在)。

这是因为
itoa
不是一个标准函数。请尝试使用
snprintf

char str[LEN];
snprintf(str, LEN, "%d", 42);
使用:


所有可由
int
表示的数字都可以放入一个12字符的数组中,而不会溢出,除非编译器对
int
使用超过32位。在大多数64位编译器中使用具有更大位大小的数字时,例如
long
,您需要为64位类型增加至少21个字符的数组大小。

制作自己的
itoa
也很容易,请尝试以下操作:

char* itoa(int i, char b[]){
    char const digit[] = "0123456789";
    char* p = b;
    if(i<0){
        *p++ = '-';
        i *= -1;
    }
    int shifter = i;
    do{ //Move to where representation ends
        ++p;
        shifter = shifter/10;
    }while(shifter);
    *p = '\0';
    do{ //Move back, inserting digits as u go
        *--p = digit[i%10];
        i = i/10;
    }while(i);
    return b;
}
char*itoa(int i,char b[]){
字符常量数字[]=“0123456789”;
char*p=b;

如果(iAt)至少足够容纳整数类型所允许的最大值,我猜。@Gabe我使用
(CHAR_BIT*sizeof(int)-1)/3+2
,正如。snprintf.snprintf()不必
-1
)更安全的方法是指定输入量。否则,如果字符串包含多字节字符,或由于数字过大而导致长度超出预期,则可能导致缓冲区溢出并导致程序崩溃(等等)。您应该提供更多信息,例如确切的错误消息、您正在使用的编译器以及SO上其他地方已经建议使用的操作系统。为了澄清:当i为零时,使用do while循环,而不是while。此代码中有一个错误:当
i=INT_MIN
时,它将失败,因为
i*=-1
行。@Max,
while
在循环开始前测试条件,
在循环开始后测试条件,
在循环开始后测试条件。@kasrak如何处理这种情况。较大的类型是唯一的选项吗?我尝试运行此程序,但遇到运行时错误。如何使其正常工作?@AndersonGreen此处的代码是正确的。您键入的代码不正确。错误消息告诉您在哪里。
sprintf
在这里进行了更详细的讨论:通常最好使用snprintf()来涵盖您不知道
str
将有多大的情况(例如多字节字符、表示无限制计数器的数字等)。
char* itoa(int i, char b[]){
    char const digit[] = "0123456789";
    char* p = b;
    if(i<0){
        *p++ = '-';
        i *= -1;
    }
    int shifter = i;
    do{ //Move to where representation ends
        ++p;
        shifter = shifter/10;
    }while(shifter);
    *p = '\0';
    do{ //Move back, inserting digits as u go
        *--p = digit[i%10];
        i = i/10;
    }while(i);
    return b;
}