不使用*printf打印数字

11

是否有可能在不使用任何*printf函数(printf, fprintf, sprintf, snprintf, vsprintf, ...)的情况下,将数字(int, float, double, long, 等)打印到stdout或文件中?


4
floatdouble 不是整数。 - dreamlax
1
可能是如何在没有printf的情况下打印IEEE754数字?的重复问题。 - Paul R
6个回答

9
如果你的libc包含一个itoa()函数,你可以使用它将整数转换为字符串。
否则,你需要自己编写代码将数字转换为字符串。

C语言程序设计(第2版)- Kernighan和Ritchie第64页中的itoa()实现:

/* itoa: convert n to characters in s */
void itoa(int n, char s[])
{
   int i, sign;

   if ((sign = n) < 0)  /* record sign */
      n = -n;           /* make n positive */
   i = 0;
   do {  /* generate digits in reverse order */
      s[i++] = n % 10 + '0';  /* get next digit */
   } while ((n /= 10) > 0);   /* delete it */
   if (sign < 0)
      s[i++] = '-';
   s[i] = '\0';
   reverse(s);
}

3
OP应该意识到这在Linux上不存在。如果他翻开K&R并翻到第56页,就会看到一个实现。 - Rafe Kettler
好主意,而且实现itoa也不太困难:http://codepad.org/fUlU6thO - hiobs

8

对于整数来说,这并不难做到,但对于浮点数来说,这个工作就要复杂得多,而且已经有人发布了指向解释的指针。对于整数,您可以像这样做:

void iprint(int n)
  { 
    if( n > 9 )
      { int a = n / 10;

        n -= 10 * a;
        iprint(a);
      }
    putchar('0'+n);
  }

3

这将导致正确的顺序:

void print_int(int num){
    int a = num;

    if (num < 0)
    {
       putc('-');
       num = -num;
    }

    if (num > 9) print_int(num/10);

    putc('0'+ (a%10));
 }

2

只需使用write()函数并自行格式化输出。


0

基于@Whitham Reeve II上面给出的答案,这里是一个更好的版本:

不需要使用'a' int变量来保存'num';因为每个递归调用都会有一个单独的'num'值副本(即按值调用)。 此外,似乎一些编译器要求您将“stdout”作为第二个参数传递以在屏幕上转储字符。

void print_int(int num){
    if (num < 0)
    {
       putc('-', stdout);
       num = -num;
    }

    if (num > 9) print_int(num/10);

    putc('0'+ (num%10), stdout);
 }

-1

我假设大多数人遇到这个问题是因为他们编写了自己的串行tx函数并需要打印一些数字。您需要修改putc调用以适应您的设置。

void print_int(int num)
{
    if (num < 0)
    {
        putc('-');
        num = -num;
    }
    else if (num == 0)
    {
        putc('0');
        return;
    }   
    while (num != 0)
    {
        putc ('0'+ (num%10));
        num /= 10;
    }
}

这将会倒序打印一个数字。


2
问题不是如何将数字倒序打印,而是如何打印一个数字。 - MD XF

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