【发布时间】:2011-04-03 08:06:35
【问题描述】:
是否可以在不实际使用任何*printf 函数的情况下打印(到stdout 或文件)一个数字(int、float、double、long 等) (printf, fprintf, sprintf, snprintf, vsprintf, ...)?
【问题讨论】:
-
float和double不是整数。
标签: c
是否可以在不实际使用任何*printf 函数的情况下打印(到stdout 或文件)一个数字(int、float、double、long 等) (printf, fprintf, sprintf, snprintf, vsprintf, ...)?
【问题讨论】:
float 和 double 不是整数。
标签: c
如果您的 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);
}
【讨论】:
嗯,对于整数来说这并不难,但对于浮点数来说,这项工作要复杂一些,并且有人已经发布了一个指向解释的指针。对于整数,你可以这样做:
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() 函数并自己格式化输出。
【讨论】:
我假设大多数人遇到这个问题是因为他们已经编写了自己的串行 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;
}
}
这将反向打印一个数字。
【讨论】:
根据上面给出的@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);
}
【讨论】: