我正在尝试将此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;
}
}
do while循环中的+'0'不会将int值转换为ascii
您自己的屏幕快照将显示其他内容(假设基于ASCII的终端)。
您的代码打印了56
,因此它打印了字节0x35和0x36,因此string[0]
和string[1]
分别包含0x35和0x36,而0x35和0x36分别是5
和6
的ASCII编码。
您还可以通过单独打印string
的元素来进行验证。
for (int i=0; string[i]; ++i)
printf("%02X ", string[i]);
printf("\n");
我尝试了您的程序,它在大多数情况下都有效。由于这一行,我得到了一些愚蠢的输出:
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[]
,并且代码会变得[[很多更复杂。