【问题标题】:Printing a number without using *printf不使用 *printf 打印数字
【发布时间】:2011-04-03 08:06:35
【问题描述】:

是否可以在不实际使用任何*printf 函数的情况下打印(到stdout 或文件)一个数字(intfloatdoublelong 等) (printf, fprintf, sprintf, snprintf, vsprintf, ...)?

【问题讨论】:

标签: c


【解决方案1】:

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

itoa() 的实现来自 C Programming Language, 2nd Edition - Kernighan and Ritchie 第 64 页:

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

【讨论】:

  • OP 应该知道这在 Linux 上不存在。不过,如果他清理 K&R 并转到第 56 页,他会看到一个实现。
  • 好主意,实现 itoa 也不是太难:codepad.org/fUlU6thO
【解决方案2】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        这将反向打印一个数字。

        【讨论】:

        • 问题不在于如何反向打印数字。这是如何打印一个数字。
        【解决方案6】:

        根据上面给出的@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);
         }
        

        【讨论】:

          猜你喜欢
          • 2016-02-11
          • 2015-10-15
          • 1970-01-01
          • 1970-01-01
          • 2013-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多