这是一个古老的做法,我试图找出我的代码出错的地方:编写一个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');
}
我只是想知道为什么我这样做的方式不起作用,虽然当我尝试使用步骤调试时,它看起来我的程序没有问题,但是,代码是打印一些有趣的字符。我认为这是因为putchar()读取数字为ascii值并打印对应ascii值的字符,也许这就是为什么在上面的代码中我们使用putchar(n%10+'0')
,所以我试图添加{{1我所有的putchar代码,但它不能正常工作。所以这是我的代码和结果,当i = -123
'0'
'0'
答案 0 :(得分: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");
}
这里有一些输出:
~/Stack-Overflow/cpp>>./test-44 Segmentation fault ~/Stack-Overflow/cpp>>./test-44 10 10 ~/Stack-Overflow/cpp>>./test-44 3456789 3456789 ~/Stack-Overflow/cpp>>./test-44 -10 -10 ~/Stack-Overflow/cpp>>./test-44 -95823 -95823 ~/Stack-Overflow/cpp>>
PS。我在Linux上测试,使用gcc 4.7.3。
现在关于第二种方法......
'0'
时将putchar
添加到整数值。if
区块和最后一个else if
区块中,您已经处理了-ve数字。0
仍是一个问题。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的问题。它没有打印任何东西。
答案 1 :(得分:1)
if(i/10!=0)
{
putchar(i%10);
printnumber((i-i%10)/10);
}
如果i < 0
,那么无论你是putchar()
还是第一个+ '0'
都有问题。