如何将整型(整数)转换为字符串?

我试图使一个函数转换成一个字符串的结构数据保存在文件中。


当前回答

将任何东西转换为字符串应该1)分配结果字符串或2)传递一个char *目标和大小。示例代码如下:

两者都适用于所有int,包括INT_MIN。它们提供了与snprintf()不同的一致输出,后者取决于当前区域设置。

方法1:内存不足时返回NULL。

#define INT_DECIMAL_STRING_SIZE(int_type) ((CHAR_BIT*sizeof(int_type)-1)*10/33+3)

char *int_to_string_alloc(int x) {
  int i = x;
  char buf[INT_DECIMAL_STRING_SIZE(int)];
  char *p = &buf[sizeof buf] - 1;
  *p = '\0';
  if (i >= 0) {
    i = -i;
  }
  do {
    p--;
    *p = (char) ('0' - i % 10);
    i /= 10;
  } while (i);
  if (x < 0) {
    p--;
    *p = '-';
  }
  size_t len = (size_t) (&buf[sizeof buf] - p);
  char *s = malloc(len);
  if (s) {
    memcpy(s, p, len);
  }
  return s;
}

方法2:如果缓冲区太小,则返回NULL。

static char *int_to_string_helper(char *dest, size_t n, int x) {
  if (n == 0) {
    return NULL;
  }
  if (x <= -10) {
    dest = int_to_string_helper(dest, n - 1, x / 10);
    if (dest == NULL) return NULL;
  }
  *dest = (char) ('0' - x % 10);
  return dest + 1;
}

char *int_to_string(char *dest, size_t n, int x) {
  char *p = dest;
  if (n == 0) {
    return NULL;
  }
  n--;
  if (x < 0) {
    if (n == 0) return NULL;
    n--;
    *p++ = '-';
  } else {
    x = -x;
  }
  p = int_to_string_helper(p, n, x);
  if (p == NULL) return NULL;
  *p = 0;
  return dest;
}

[编辑]应@Alter Mann的要求

(CHAR_BIT*sizeof(int_type)-1)*10/33+3至少是将某个有符号整数类型编码为由可选的负号、数字和空字符组成的字符串所需的最大字符数。

有符号整数中非符号位的个数不超过CHAR_BIT*sizeof(int_type)-1。一个以10为基数的n位二进制数的表示最多需要n*log10(2) + 1位。10/33略大于log10(2)+1表示符号字符,+1表示空字符。其他分数也可以用28/93。


方法3:如果一个人想要生活在边缘,缓冲区溢出不是一个问题,一个简单的C99或更高的解决方案,它处理所有int。

#include <limits.h>
#include <stdio.h>

static char *itoa_simple_helper(char *dest, int i) {
  if (i <= -10) {
    dest = itoa_simple_helper(dest, i/10);
  }
  *dest++ = '0' - i%10;
  return dest;
}

char *itoa_simple(char *dest, int i) {
  char *s = dest;
  if (i < 0) {
    *s++ = '-';
  } else {
    i = -i;
  }
  *itoa_simple_helper(s, i) = '\0';
  return dest;
}

int main() {
  char s[100];
  puts(itoa_simple(s, 0));
  puts(itoa_simple(s, 1));
  puts(itoa_simple(s, -1));
  puts(itoa_simple(s, 12345));
  puts(itoa_simple(s, INT_MAX-1));
  puts(itoa_simple(s, INT_MAX));
  puts(itoa_simple(s, INT_MIN+1));
  puts(itoa_simple(s, INT_MIN));
}

样例输出

0
1
-1
12345
2147483646
2147483647
-2147483647
-2147483648

其他回答

还有另一种方法。

#include <stdio.h>

#define atoa(x) #x

int main(int argc, char *argv[])
{
    char *string = atoa(1234567890);
    printf("%s\n", string);
    return 0;
}

如果您正在使用GCC,您可以使用GNU扩展asprintf函数。

char* str;
asprintf(&str, "%i", 12313);
free(str);

Sprintf返回字节并添加一个空字节:

# include <stdio.h>
# include <string.h>

int main() {
    char buf[1024];
    int n = sprintf( buf, "%d", 2415);
    printf("%s %d\n", buf, n);
}

输出:

2415 4

正如评论中指出的,itoa()不是标准,所以最好使用竞争对手回答中建议的sprintf()方法!


可以使用itoa()函数将整数值转换为字符串。

这里有一个例子:

int num = 321;
char snum[5];

// Convert 123 to string [buf]
itoa(num, snum, 10);

// Print our string
printf("%s\n", snum);

如果你想把你的结构输出到一个文件中,不需要事先转换任何值。您可以只使用printf格式规范来指示如何输出值,并使用printf系列中的任何操作符来输出数据。

使用函数itoa()将整数转换为字符串

例如:

char msg[30];
int num = 10;
itoa(num,msg,10);