【问题标题】:How to convert integer to string in C? [duplicate]如何在C中将整数转换为字符串? [复制]
【发布时间】:2012-03-28 03:38:58
【问题描述】:

我试过这个例子:

/* 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 不存在)。

【问题讨论】:

  • 您应该提供更多信息,例如 exact 错误消息、您使用的编译器以及操作系统。
  • my-itoa 已经在 SO 的其他地方被建议了。

标签: c string integer type-conversion


【解决方案1】:

制作自己的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()函数。

【讨论】:

  • 澄清一下:当 i 为零时,使用 do while 循环而不是 while
  • 这段代码有个bug:i = INT_MIN会失败,因为i *= -1这一行。
  • @Max, while 测试循环开始前的条件,do while 测试循环开始后的条件。
  • @kasrak 如何处理这种情况。更大的类型是唯一的选择吗?
【解决方案2】:

使用sprintf():

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

int 可以表示的所有数字都将适合 12 字符数组而不会溢出,除非您的编译器以某种方式使用超过 32 位的 int。当使用具有更大位大小的数字时,例如long 对于大多数 64 位编译器,您需要增加数组大小 — 对于 64 位类型,至少 21 个字符。

【讨论】:

  • 我尝试运行此程序,但出现运行时错误。我怎样才能让它正常工作? ideone.com/Xl21B4
  • @AndersonGreen 这里的代码是正确的。你打错了。错误消息告诉你在哪里。
  • sprintf 在这里更详细地讨论:stackoverflow.com/questions/8232634/simple-use-of-sprintf-c
  • 通常最好使用 snprintf() 来覆盖您不知道str 将有多大的情况。 (例如多字节字符、表示无限制计数器的数字等)。
【解决方案3】:

那是因为itoa 不是标准函数。请改用snprintf

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

【讨论】:

  • 我猜至少足以容纳整数类型允许的最大值。
  • @Gabe 我使用(CHAR_BIT * sizeof(int) - 1) / 3 + 2,作为caf mentioned
  • 您不必为 snprintf 发送- 1
  • snprintf() 更安全,因为您可以指定输入的数量。否则,如果您的字符串包含多字节字符,或者由于数字大而比您预期的要长,您可能会溢出缓冲区并导致程序崩溃(等等)。
猜你喜欢
  • 2012-04-30
  • 2011-12-27
  • 1970-01-01
  • 2011-04-16
  • 2011-03-25
  • 1970-01-01
  • 2013-07-22
  • 2010-10-05
相关资源
最近更新 更多