是否有可能在不使用任何*printf
函数(printf
, fprintf
, sprintf
, snprintf
, vsprintf
, ...)的情况下,将数字(int
, float
, double
, long
, 等)打印到stdout
或文件中?
是否有可能在不使用任何*printf
函数(printf
, fprintf
, sprintf
, snprintf
, vsprintf
, ...)的情况下,将数字(int
, float
, double
, long
, 等)打印到stdout
或文件中?
itoa()
函数,你可以使用它将整数转换为字符串。C语言程序设计(第2版)- Kernighan和Ritchie第64页中的itoa()
实现:
/* 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));
}
只需使用write()函数并自行格式化输出。
基于@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);
}
我假设大多数人遇到这个问题是因为他们编写了自己的串行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;
}
}
这将会倒序打印一个数字。
float
和double
不是整数。 - dreamlax