不使用* printf打印数字

时间:2011-04-03 08:06:36

标签: c

是否可以打印(到stdout或文件)一个数字(intfloatdoublelong等。)没有实际使用任何*printf函数(printffprintfsprintfsnprintfvsprintf,...)?

6 个答案:

答案 0 :(得分:7)

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

来自C Programming Language, 2nd Edition - Kernighan and 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);
}

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

这将导致正确的顺序:

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

答案 4 :(得分:0)

我假设大多数人遇到这个问题,因为他们已经编写了自己的序列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;
    }
}

这将反向打印一个数字。

答案 5 :(得分: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);
 }