C 不使用*printf打印数字

C 不使用*printf打印数字,c,C,是否可以在不实际使用任何*printf函数(printf,float,double,long等)的情况下打印(到stdout或文件)一个数字(int,sprintf,snf,vsprintf,…)?如果您的libc包含itoa()函数,您可以使用它将整数转换为字符串。 否则,您必须自己编写代码将数字转换为字符串 itoa()第64页的实施: /*itoa:将n转换为s中的字符*/ 无效itoa(整数n,字符s[] { int i,符号; 如果((符号=n)0);/*删除它*/ if(符号 9 )

是否可以在不实际使用任何
*printf
函数(
printf
float
double
long
等)的情况下打印(到
stdout
或文件)一个数字(
int
sprintf
snf
vsprintf
,…)?

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

itoa()
第64页的实施:

/*itoa:将n转换为s中的字符*/
无效itoa(整数n,字符s[]
{
int i,符号;
如果((符号=n)<0)/*记录符号*/
n=-n;/*使n为正*/
i=0;
{/*是否按相反顺序生成数字*/
s[i++]=n%10+'0';/*获取下一个数字*/
}而((n/=10)>0);/*删除它*/
if(符号<0)
s[i++]='-';
s[i]='\0';
反面;
}

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

好吧,对整数来说并不难,但对于浮点数来说,这项工作要复杂得多,有人已经发布了一个指针来解释这一点。对于整数,可以执行如下操作:

void iprint(int n)
  { 
    if( n > 9 )
      { int a = n / 10;

        n -= 10 * a;
        iprint(a);
      }
    putchar('0'+n);
  }

我假设大多数人遇到这个问题是因为他们编写了自己的串行发送函数,需要打印一些数字。您需要修改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;
    }
}
void print\u int(int num)
{
if(num<0)
{
putc('-');
num=-num;
}
else if(num==0)
{
putc('0');
返回;
}   
while(num!=0)
{
putc('0'+(num%10));
num/=10;
}
}

这将反向打印一个数字。

这将导致正确的顺序:

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));
 }
void print\u int(int num){
int a=num;
if(num<0)
{
putc('-');
num=-num;
}
如果(num>9)打印int(num/10);
putc('0'+(a%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);
 }
void print\u int(int num){
if(num<0)
{
putc('-',stdout);
num=-num;
}
如果(num>9)打印int(num/10);
putc('0'+(num%10),标准输出);
}

float
double
不是整数。应该注意,OP的可能副本在Linux上不存在。如果他掸掉K&R的灰尘,转到第56页,他会看到一个实现。好主意,实现itoa也不是太难:问题不是如何反向打印数字。这是如何打印一个数字。
void print_int(int num){
    if (num < 0)
    {
       putc('-', stdout);
       num = -num;
    }

    if (num > 9) print_int(num/10);

    putc('0'+ (num%10), stdout);
 }