如何在C中将int转换为char *(没有sprintf)

时间:2016-04-03 00:03:14

标签: c char int printf

有一天,我想用C转换一个整数到一个char *,这个int可以是负数。

我无法使用sprintf,snprintf,所以我该怎么做?

3 个答案:

答案 0 :(得分:1)

要滚动一个自己的itoa() - 类函数,首先必须解决如何处理内存的问题。最简单的方法是为所有可能的int值(INT_MIN)使用足够大的内存。

所需的缓冲区大小是数学ceiling(log10(-INT_MIN))+3。这可以近似为:

#include <limits.h>
#define INT_STR_SIZE (sizeof(int)*CHAR_BIT/3 + 3)

然后使用%10然后使用/10从最低有效数字开始逐个构建数字以减少数值。

通过使用do循环,代码捕获了x==0的极端情况,因为至少创建了一个数字。

此代码避免if (x < 0) { x = -x; ...否定INT_MIN(或乘以-1会导致int溢出,即UB。

#include <limits.h>
#define INT_STR_SIZE (sizeof(int)*CHAR_BIT/3 + 3)

char *my_itoa(char *dest, size_t size, int x) {
  char buf[INT_STR_SIZE];
  char *p = &buf[INT_STR_SIZE - 1];
  *p = '\0';
  int i = x;

  do {
    *(--p) = abs(i%10) + '0';
    i /= 10;
  } while (i);

  if (x < 0) {
    *(--p) = '-';
  }
  size_t len = (size_t) (&buf[INT_STR_SIZE] - p);
  if (len > size) {
    return NULL;  // Not enough room
  }
  return memcpy(dest, p, len);
}

使用C99或更高版本,代码可以使用复合文字处理缓冲区创建,从而为每个mt_itoa()调用提供单独的缓冲区。

// compound literal C99 or later
#define MY_ITOA(x) my_itoa((char [INT_STR_SIZE]){""}, INT_STR_SIZE, x)

int main(void) {
  printf("%s %s %s %s\n", MY_ITOA(INT_MIN), MY_ITOA(-1), MY_ITOA(0), MY_ITOA(INT_MAX));
  return (0);
}

输出

-2147483648 -1 0 2147483647

答案 1 :(得分:-2)

从整数转换为char *使用函数itoa()。 / * itoa例子* /

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

答案 2 :(得分:-4)

所以,我做了一个创造这项工作的职能

编辑:有泄漏,功能有点脏,我同意......

创建一个文件my_int_char.c,其中包含以下内容:

#include <stdlib.h>

char    *my_int_char(int nbr)
{
  char  *tab = malloc(sizeof(char) * 16);
  int   count = 0, div=1, neg = 0, c = 0, tmp_div = 1;
  if (nbr < 0)
    {
      nbr *= -1;
      neg = 1;
    }
  while (nbr / tmp_div >= 1)
    {
      tmp_div *= 10;
      c++;
    }
  while (c >= count && (c - (count + 1)) >= 0)
    {
      tab[c - (count + 1)] = nbr / div % 10 + 48;
      div *= 10;
      ++count;
    }
  if (neg)
    {
      while (c >= 0)
        {
          tab[c + 1] = tab[c];
          c--;
        }
      tab[0] = '-';
    }
  return (tab);
}

你有它!现在在main中测试你的函数;

main()
{
   printf("%s\n", my_int_char(-42));
   printf("%s\n", my_int_char(42));
   printf("%s\n", my_int_char(42021));
   return (0);
}