不使用* printf打印数字

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

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

itoa()实现自C编程语言,第2版 – Kernighan和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); } 

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

 void iprint(int n) { if( n > 9 ) { int a = n / 10; n -= 10 * a; iprint(a); } putchar('0'+n); } 

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

这将导致正确的顺序:

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

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

这将反向打印一个数字。