+'0'不会给出int的char值

问题描述 投票:0回答:2

我正在尝试将此int转换为char程序。 do while循环中的+'0'不会将int值转换为ascii,而main中的+'0'正在转换。我已经尝试了很多语句,但是在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

c string int ascii do-while
2个回答
1
投票

do while循环中的+'0'不会将int值转换为ascii

您自己的屏幕快照将显示其他内容(假设基于ASCII的终端)。

您的代码打印了56,因此它打印了字节0x35和0x36,因此string[0]string[1]分别包含0x35和0x36,而0x35和0x36分别是56的ASCII编码。

您还可以通过单独打印string的元素来进行验证。

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

printf("\n");

1
投票

我尝试了您的程序,它在大多数情况下都有效。由于这一行,我得到了一些愚蠢的输出:

s[i]=EOF;

EOF是一个负整数宏,表示“文件末尾”。其实际值由实现定义。看来您真正想要的是一个空终止符:

s[i]='\0';

这将删除输出中的所有愚蠢的字符。

我也将main中的字符串稍大一些。没有理由我们不能使用类似的东西

char string[12];

我将使用最少的12,它将覆盖带符号的32位INT_MAX

编辑

看来(基于所有注释,您可能实际上正在尝试制作一个仅使用数字ascii值输出字符的程序。 convert函数actually的作用是将整数转换为该整数的字符串表示形式。例如:

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

convert基本上是itoa的手动实现。

如果您尝试简单地输出给定ASCII码的字符,这是一个much较简单的程序。首先,您应该了解这里的代码是对convert试图做的事情的错误解释:

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

先前添加'0'的目的是将一位整数转换为他们的ascii代码版本。作为参考,请使用:asciitable。例如,如果您想将整数4转换为字符'4',则可以在'0'上加4(ASCII码48)以获得52。52是字符'4'的ASCII码。要打印出由ASCII代码表示的字符,解决方案要简单得多。正如其他人在评论中指出的那样,char本质上已经是数字类型。这将为您提供所需的行为:

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

这将起作用,但是为了安全起见,应将其强制转换为char类型。是否冗余是可以定义的实现方式。我确实相信将错误的类型发送到printf是不确定的行为,无论它是否在这种情况下都有效。安全版本:

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

因此您可以在main中编写整个程序,因为不需要convert功能:

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

我们不需要0-127以外的任何值。 char的范围是256位(又称一个字节!),范围从-127到127。如果要对高位字符进行字面解释,可以使用unsigned char(0-255)。这在linux终端上是不可取的,它可能需要UTF-8字符。大于127的值将代表多字节字符的一部分。如果要支持此功能,则需要char[],并且代码会变得[[很多更复杂。

© www.soinside.com 2019 - 2024. All rights reserved.