2011-04-03 15 views
6

是否有可能打印实际上并没有使用任何的*printf函数(printffprintf(到stdout,或者一个文件)的数(intfloatdoublelong等), sprintf,snprintf,vsprintf,...)?打印数量,而无需使用* printf的

+4

'float'和'double'不是整数。 – dreamlax 2011-04-03 08:17:38

+0

为什么你需要? – gnud 2011-04-03 08:24:16

+1

可能重复[如何打印出IEEE754号码(不含printf)?](http://stackoverflow.com/questions/4274926/how-do-you-print-out-an-ieee754-number-without- printf) – 2011-04-03 08:29:23

回答

7

如果你的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); 
} 
+2

OP应该知道这在Linux上不存在。如果他擦掉K&R并转到第56页,他会看到一个实施。 – 2011-04-03 08:20:50

+0

好主意,并且实施itoa也不难:http://codepad.org/fUlU6thO – hiobs 2011-04-03 08:32:49

+0

唉,即使K&R也不处理INT_MIN .. – lowq 2017-10-27 04:16:29

2

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

3

那么,它不难完成的整数,但工作是一个浮点数更复杂一点,有人已经发布了一个指针来解释这一点。对于整数,你可以这样做:

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

     n -= 10 * a; 
     iprint(a); 
     } 
    putchar('0'+n); 
    } 
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; 
    } 
} 

这将打印一个相反的数字。

+0

问题不在于如何以相反方式打印数字。这是如何打印一个数字。 – 2017-10-05 04:07:00

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