1

这是一种古老的做法,我试图找出我的代码哪里出错了:编写 ac 程序以仅使用 putchar 打印一个整数。我知道一种正确的方法是:

void printnumber(int n)
{

    if (n < 0) {
        putchar('-');
        n = -n;
    }

    if (n == 0)
        putchar('0');

    if (n/10)
        printnumber(n/10);

    putchar(n%10 + '0');
}

我只是想知道为什么我的方法不起作用,尽管当我尝试使用 step over 进行调试时,看起来我的程序没有问题,但是,代码正在打印一些有趣的字符。我认为这是因为 putchar() 将数字读取为 ascii 值并打印与 ascii 值对应的字符,也许这就是为什么在上面的代码中,我们使用putchar(n%10+'0'),所以我尝试添加'0'到我所有的 putchar 代码中,但是它不能正常工作。所以这是我的代码和结果,'0'当 i=-123 时没有和

void printnumber(int i)
{

    if(i/10!=0)
    {
        putchar(i%10);
        printnumber((i-i%10)/10);
    }
    else if((i/10==0) && (i%10!=0) && (i>0))
        putchar(i%10);
    else if((i/10==0) && (i%10!=0) && (i<=0))
        putchar(-i%10);

}

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

2

第一个版本对我来说就像一个魅力。

这是main.

#include <stdio.h>
#include <stdlib.h>

void printnumber(int n)
{

   if (n < 0) {
       putchar('-');
       n = -n;
   }

   if (n == 0)
      putchar('0');

   if (n/10)
      printnumber(n/10);

   putchar(n%10 + '0');
}

int main(int argc, char** argv)
{
   int n = atoi(argv[1]);
   printnumber(n);
   printf("\n");
}

这是一些输出:

~/堆栈溢出/cpp>>./test-44
分段故障
~/堆栈溢出/cpp>>./test-44 10
10
~/堆栈溢出/cpp>>./test-44 3456789
3456789
~/堆栈溢出/cpp>>./test-44 -10
-10
~/堆栈溢出/cpp>>./test-44 -95823
-95823
~/堆栈溢出/cpp>>

PS。我正在使用 gcc 4.7.3 在 Linux 上进行测试。

现在关于第二种方法......

  1. 绝对需要在调用中添加'0'整数值。putchar
  2. 在第一个if块和最后一个else if块中,您需要处理 -ve 数字。
  3. 打印0仍然是一个问题。
  4. 在第一个if块中,递归必须在打印之前。否则,您最终将以相反的顺序打印数字。

这是我想出的:

void printnumber(int i)
{
    if(i/10!=0)
    {
        printnumber(i/10);
        if ( i > 0 )
        {
           putchar(i%10 + '0');
        }
        else
        {
           putchar(-i%10 + '0');
        }
    }
    else if((i/10==0) && (i%10!=0) && (i>0))
    {
        putchar(i%10 + '0');
    }
    else if((i/10==0) && (i%10!=0) && (i<=0))
    {
        putchar('-');
        putchar(-i%10+'0');
    }    
}

PS。我的版本仍然存在数字 0 的问题。它不打印任何内容。

于 2014-03-21T03:36:57.630 回答
1
if(i/10!=0)
{
    putchar(i%10);
    printnumber((i-i%10)/10);
}

如果i < 0,那么putchar()无论你+ '0'与否,第一个都有麻烦。

于 2014-03-21T03:31:44.720 回答