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

197

我尝试了这个例子:

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

但是那里的示例不起作用(它说函数 itoa 不存在)。


3
你应该提供更多信息,比如精确的错误信息、你正在使用的编译器以及操作系统。 - Gabe
my-itoa 已经在 Stack Overflow 的其他位置被推荐过了。 - menjaraz
3个回答

304

使用sprintf()函数:

int someInt = 368;
char str[12];
sprintf(str, "%d", someInt);

如果你的编译器使用的是32位的int,那么所有可以由int表示的数字都可以在一个12个字符的数组中存储而不会溢出。然而,如果你要使用更大位数的数字,比如64位的long,则需要增加数组的大小——至少21个字符才能存储。


1
我尝试运行这个程序,但是出现了运行时错误。我该如何使其正常工作?http://ideone.com/Xl21B4 - Anderson Green
@AndersonGreen 这里的代码是正确的。你输入有误。错误信息告诉了你在哪里。 - nschum
在这里更详细地讨论了sprintf:https://dev59.com/NGsy5IYBdhLWcg3w6iRZ - Anderson Green
11
通常最好使用snprintf()来处理那些你不知道str有多大的情况,例如多字节字符、表示没有限制的计数器的数字等。 - gone

60
制作自己的 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;
}

或者使用标准的sprintf()函数。


1
澄清一下:当i为零时,使用do while循环代替while循环。 - max
3
这段代码存在一个漏洞:当i = INT_MIN时,由于i *= -1这一行,代码将会失败。 - kasrak
1
@Max,“while”在循环开始之前测试条件,“do while”在循环已经开始后测试条件。 - Semirix
@kasrak 如何处理这种情况。是否只有使用更大的类型才是唯一的选择? - user877329

50

那是因为itoa不是一种标准函数。请尝试使用snprintf代替。

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

3
http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/ - Sebastian Flückiger
2
@Gabe 我使用 (CHAR_BIT * sizeof(int) - 1) / 3 + 2,就像 caf 提到的 - cnicutar
3
snprintf函数中不需要使用-1 - Per Johansson
是的,但 sprintf() 更好,因为你不需要不必要的第二个参数。 - Janko
3
snprintf() 在这方面更加安全,因为你可以指定输入的长度。否则,如果你的字符串包含多字节字符,或者由于大数字导致字符串变得比预期更长,你可能会溢出缓冲区并使程序崩溃(等等)。 - gone
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接