【问题标题】:print a integer in c using putchar only仅使用 putchar 在 c 中打印一个整数
【发布时间】:2014-03-21 03:28:15
【问题描述】:

这是一种古老的做法,我正在尝试找出我的代码出错的地方:编写一个 c 程序以仅使用 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 代码,但它不能正常工作。所以这是我的代码和结果,当 i=-123 时没有和使用 '0'

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);

}

【问题讨论】:

    标签: c putchar


    【解决方案1】:

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

    这是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. 绝对需要在调用putchar 时将'0' 添加到整数值。
    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 的问题。它不打印任何内容。

    【讨论】:

    • 也许我没有说清楚,第一个版本很好,我遇到的问题是第二个代码。
    • 显然我错过了那个小细节。
    • @user3858 我更新了答案以解决您对第二个功能的担忧。
    • @user3858 顺便说一句,我可以用 else if ( i &gt; 0 ) 替换第二个 else if 语句,结果相同。同样,最后一个else if 语句可以只是else if ( i &lt;= 0 )
    【解决方案2】:
    if(i/10!=0)
    {
        putchar(i%10);
        printnumber((i-i%10)/10);
    }
    

    如果i &lt; 0,那么无论你+ '0'与否,第一个putchar()都有问题。

    【讨论】:

    • 所以 putchar 只能取正数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多