起因:
牛客网一道题,需要按行输入多组字母,然后按行输出其转换大小写后的字母,我们来探讨一下。
分析:
有两个要点需要注意,一是要按行多组输入,二是要字母大小写转换。首先是按行多组输入,我们可以用while循环获取多组输入,scanf()或者getchar()函数可以获取输入值;然后字母的大小写转换需要根据ASCLL表来分析,我们可以在表中看到大小写字母的十进制其实是相差32的,因此只需要将输入的字母做十进制±32运算即可实现转换。
在此你可能有疑问,字母属于char类型,32是int类型,这能运算吗?
答案是可以的。在运算的时候,char类型是可以转换为int类型的(计算过程中自定进行转换,不需要强制转换的)。计算机通过查找对应字符变量值的ASCII值(十进制),利用其在ASCII里的对应值进行加减运算,当然两个char类型的运算也需要进行这样的转换。
解决方案:
解释完原理后我们就可以用代码实现啦
方法一: 我们用scanf()函数接收输入,然后printf输出
int main()
{
int input = 0;
while ((scanf("%c", &input)) != EOF)
{
/*if (input = '\n')
continue;*/
//如果遇到按回车运行程序影响转换的情况,可以加上这条语句,跳过回车字符 '\n'
if (input >= 'A' && input <= 'Z')
{
input = input + 32;
printf("%c\n", input);
}
else if (input >= 'a' && input <= 'z')
{
input = input - 32;
printf("%c\n", input);
}
}
return 0;
}
程序运行后
方法二: 用getchar()函数获取输入,用putchar()输出 可能部分朋友不了解getchar()函数,我们可以看一下库描述
其实简单说就是逐个获取键盘输入的字符,返回的值就是ASCLL码十进制的值,读取错误则返回EOF,putchar()原理是类似的,下面是实现:
int main()
{
char input = 0;
while ((input = getchar()) != EOF)
{
if (input >= 'A' && input <= 'Z')
{
input = input + 32;
putchar(input);
printf("\n");
}
else if (input >= 'a' && input <= 'z')
{
input = input - 32;
putchar(input);
printf("\n");
}
}
return 0;
}
运行结果