1

This is an old practice and I am trying to identify where i went wrong with my code: write a c program to print an integer using putchar only. I know one right way to do it is:

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

I just want to know why my way of doing it does not work, though as I was trying to debug using step over, it looks there is no problem with my procedure, however, the code is printing some funny character. I thought it is because putchar() read the number as ascii value and print the character corresponding to ascii value, and maybe this is why in the code above, we are using putchar(n%10+'0'), so I tried to add '0' to all my putchar code, but it does not work properly. So here is my code and result without and with '0' when 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);

}

enter image description here

enter image description here

user3858
  • 129
  • 2
  • 3
  • 12

2 Answers2

3

The first version works like a charm for me.

Here's the function with 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");
}

Here's some output:

~/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. I am testing on Linux, using gcc 4.7.3.

Now about the second approach...

  1. Adding '0' to the integer value in the call to putchar is absolutely needed.
  2. In the first if block and the last else if block, you have take care of -ve numbers.
  3. Printing 0 is still an issue.
  4. In the first if block, recursion has to be before the print. Otherwise, you will end up printing the digits in the reverse order.

Here's what I came up with:

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. My version continues to have a problem with the number 0. It doesn't print anything.

R Sahu
  • 204,454
  • 14
  • 159
  • 270
  • maybe i did not make myself clear, the first version works great, what i am having trouble with is the second code. – user3858 Mar 21 '14 at 04:05
  • Apparently I missed that little detail. – R Sahu Mar 21 '14 at 04:10
  • @user3858 I updated my answer to address your concerns regarding the second function. – R Sahu Mar 21 '14 at 04:43
  • @user3858 BTW, I could replace the second `else if` statement by just `else if ( i > 0 )` with the same result. Similarly, the last `else if` statement can be just `else if ( i <= 0 )`. – R Sahu Mar 21 '14 at 04:44
1
if(i/10!=0)
{
    putchar(i%10);
    printnumber((i-i%10)/10);
}

If i < 0, then the first putchar() is in trouble no matter you + '0' or not.

timrau
  • 22,578
  • 4
  • 51
  • 64