不使用 *printf 打印数字

问题描述 投票:0回答:7

是否可以在不实际使用任何

stdout
函数的情况下打印(到
int
或文件)数字(
float
double
long
*printf
等) printf
fprintf
sprintf
snprintf
vsprintf
、……)?

c
7个回答
10
投票
如果您的 libc 包含

itoa()

 函数,您可以使用它将整数转换为字符串。
否则,您必须自己编写代码将数字转换为字符串。

itoa()

 
C 编程语言,第二版 - 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); }
    

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

0
投票
这是我对 uint 执行此操作的方法,但将其调整为有符号是微不足道的。 我发布此内容是为了防止有人想要一个非递归且不使用

reverse

 的版本。

static void printI(uint16_t i) { uint16_t rev = 0; uint8_t count = 0; do { rev = (rev * 10) i % 10; i /= 10; count++; } while (i); while(count--) { printC((rev % 10) + '0'); rev /= 10; } }
对于

printf

中的浮点和其他格式,我建议查看以下内容:
https://github.com/charlesnicholson/nanoprintf


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

这将反向打印一个数字。

© www.soinside.com 2019 - 2024. All rights reserved.