是否可以在不实际使用任何
stdout
函数的情况下打印(到 int
或文件)数字(float
、double
、long
、*printf
等) printf
、
fprintf
、
sprintf
、
snprintf
、
vsprintf
、……)?
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);
}
void iprint(int n)
{
if( n > 9 )
{ int a = n / 10;
n -= 10 * a;
iprint(a);
}
putchar('0'+n);
}
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));
}
不需要 '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);
}
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
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;
}
}
这将反向打印一个数字。