初学C语言,关于int和char

想写一个程序,输入小写字母时,输出大写字母,输入大写字母,输出小写字母。
#include <stdio.h>
int main()
{
int a;
scanf("%c",&a);
if (a>='a'&&a<='z')
{
a=a-32;

}
else
{
a=a+32;

}
printf("%c\n",a);

return 0;
}
这个程序运行,输入大写字母可以正常输出小写字母,输入小写字母却输出“?”,这是什么原因?

将int改成char之后,大小写字母可以正常转化了,程序完美运行。

所以int 和char到底怎么用,为什么这个程序用int可以由大写字母转小写,却不能由小写字母转大写??

没有问题啊,虽然int表示的范围比char大,但是在合理的输入情况下并不会出现你所说的情况。
代码:
#include
int main()
{
int a[4]={'a','z','A','Z'};
for(int i=0;i<4;i++)
printf("%c\t",a[i]);
printf("\n");
for(int i=0;i<4;i++)
if(a[i]>='a'&&a[i]<='z')
{
a[i]=a[i]-32;
}else{
a[i]=a[i]+32;
}
for(int i=0;i<4;i++)
printf("%c\t",a[i]);
return 0;
}
运行结果:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-10-17
问题在使用了scanf这个函数。scanf对变量的类型与控制符的类型对应要求是很严格的,用%c控制输入int型变量a是不妥的。你换成a=getchar();,相信就没有什么问题了。原来的代码实际上if(a>='a'&&a<='z')这里无论输入大写还是小写都不执行,一直在执行else后的语句,所以输入大写时+32变成了小写,而输入小写时+32就走出字符范围了,没有对应的字符,编译器就用?代替输出了。使用类型敏感函数scanf时这一点要特别注意。如果非要使用scanf,那把if()的()中的变量要强制一下,可以写成if ((char)a>='a'&&(char)a<='z')也应该是可以的。供参考。追问

好了,懂了

本回答被提问者和网友采纳
第2个回答  2018-10-17
因为,根本没有走进if (a>='a'&&a<='z')这个逻辑
也就是,无论你输入的是小写的字母还是大写的字母,最终都会执行a=a+32这个代码,
大写自然能转小写。
而小写的字母值比较大,加32后,都越界了,所以是乱码。追问

为什么把int改成char,就可以执行a=a-32了?

追答

看你的编译器了,我这int是8个字节,char转成int后,高位前4个字节用1补全,后3个字节用1100补全,最后1个字节才是char的值。
最后得到的就是一个很大的负值,所以a的值不在这个范围,if(a>='a'&&a<-'z')。
如果是它本身存char,那自然只有1个字节了,输入小写字母自然就在这个范围了

追问

谢谢你的回答,但是抱歉没能采纳你

第3个回答  2018-10-17
取值范围不同,int 取值范围 -32768到+32767,char 的取值范围 -128到+127。追问

那为什么用int,小写字母不能转化大写字母呢?而用char就可以了

那为什么用int,小写字母不能转化大写字母呢?而用char就可以了

追答

你的程序没有任何问题,我不知道为什么大写不能转小写。我用你的程序运行是可以大写转小写的。

main()
{
int a;
scanf("%c",&a);
if(a>='a'&&a<='z') a-=32;
else a+=32;
printf("%c",a);
}

这是你的程序,我只是精简了一下

追问

嗯,这个程序正常运行的话,输入A就会输出a,输入a就会输出A,但是我的程序不行,输入a就输出问号

追答

现在和你的完全一样了,照样没问题

#include
int main()
{
int a;
scanf("%c",&a);
if(a>='a'&&a<='z')
{
a=a-32;
}
else
{
a=a+32;
}
printf("%c\n",a);
return 0;
}

相似回答