meivinay
meivinay

Reputation: 9

+'0' wont give char value of int

I was trying to make this int to char program. The +'0' in the do while loop wont convert the int value to ascii, whereas, +'0' in main is converting. I have tried many statements, but it won't work in convert() .

#include<stdio.h>
#include<string.h>
void convert(int input,char s[]);
void reverse(char s[]);

int main()
{
        int input;
        char string[5];
        //prcharf("enter int\n");
        printf("enter int\n");
        scanf("%d",&input);
        convert(input,string);
        printf("Converted Input is : %s\n",string);
        int i=54;
        printf("%c\n",(i+'0')); //This give ascii char value of int
        printf("out\n");
}

void convert(int input,char s[])
{
        int sign,i=0;

        char d;
        if((sign=input)<0)
                input=-input;

        do
        {
                s[i++]='0'+input%10;//but this gives int only
        } while((input/=10)>0);

        if(sign<0)
                s[i++]='-';

        s[i]=EOF;
        reverse(s);
}

void reverse(char s[])
{
        int i,j;
        char temp;
        for(i=0,j=strlen(s)-1;i<j;i++,j--)
        {
                temp=s[i];
                s[i]=s[j];
                s[j]=temp;
        }
}

Output screenshot

Code screenshot

Upvotes: 0

Views: 220

Answers (2)

Jason
Jason

Reputation: 2671

I tried your program and it is working for the most part. I get some goofy output because of this line:

s[i]=EOF;

EOF is a negative integer macro that represents "End Of File." Its actual value is implementation defined. It appears what you actually want is a null terminator:

s[i]='\0';

That will remove any goofy characters in the output.

I would also make that string in main a little bigger. No reason we couldn't use something like

char string[12];

I would use a bare minimum of 12 which will cover you to a 32 bit INT_MAX with sign.

EDIT

It appears (based on all the comments) you may be actually trying to make a program that simply outputs characters using numeric ascii values. What the convert function actually does is converts an integer to a string representation of that integer. For example:

int num = 123;            /* Integer input */
char str_num[12] = "123"; /* char array output */

convert is basically a manual implementation of itoa.

If you are trying to simply output characters given ascii codes, this is a much simpler program. First, you should understand that this code here is a mis-interpretation of what convert was trying to do:

int i=54;
printf("%c\n",(i+'0'));

The point of adding '0' previously, was to convert single digit integers to their ascii code version. For reference, use this: asciitable. For example if you wanted to convert the integer 4 to a character '4', you would add 4 to '0' which is ascii code 48 to get 52. 52 being the ascii code for the character '4'. To print out the character that is represented by ascii code, the solution is much more straightforward. As others have stated in the comments, char is a essentially a numeric type already. This will give you the desired behavior:

int i = 102    /* The actual ascii value of 'f' */
printf("%c\n", i);

That will work, but to be safe that should be cast to type char. Whether or not this is redundant may be implementation defined. I do believe that sending incorrect types to printf is undefined behavior whether it works in this case or not. Safe version:

printf("%c\n", (char) i);

So you can write the entire program in main since there is no need for the convert function:

int main()
{
        /* Make initialization a habit */
        int input = 0;  

        /* Loop through until we get a value between 0-127 */
        do {
                printf("enter int\n");
                scanf("%d",&input);
        } while (input < 0 || input > 127);

        printf("Converted Input is : %c\n", (char)input);
}

We don't want anything outside of 0-127. char has a range of 256 bits (AKA a byte!) and spans from -127 to 127. If you wanted literal interpretation of higher characters, you could use unsigned char (0-255). This is undesirable on the linux terminal which is likely expecting UTF-8 characters. Values above 127 will be represent portions of multi-byte characters. If you wanted to support this, you will need a char[] and the code will become a lot more complex.

Upvotes: 1

ikegami
ikegami

Reputation: 385655

The +'0' in the do while loop wont convert the int value to ascii

Your own screenshot shows otherwise (assuming an ASCII-based terminal).

Your code printed 56, so it printed the bytes 0x35 and 0x36, so string[0] and string[1] contain 0x35 and 0x36 respectively, and 0x35 and 0x36 are the ASCII encodings of 5 and 6 respectively.

You can also verify this by printing the elements of string individually.

for (int i=0; string[i]; ++i)
   printf("%02X ", string[i]);

printf("\n");

Upvotes: 1

Related Questions