题目描述
实现字母的大小写转换。多组输入输出。
输入描述:
多组输入,每一行输入大写字母。
输出描述:
针对每组输入输出对应的小写字母。
示例1
输入
A
B
输出
a
b
思路:当看到这个题时,通过“大小写转换”可以立马反应出,通过ASCII 码进行转换,即为:大写字母+32=小写字母。
即可初步有如下代码的思路:
#include<stdio.h>
int main()
{
int ch=0;
ch=getchar();
putchar(ch+32);
return 0;
}
易得,如上的代码是远远不足的,它只是一个大概的方向。上式代码有一个缺点:它只能接收一个字符,不会再处理第二个。所有此代码不满足题意。
(强调!)这道题目要的是多组输入,所以我们可以考虑采用while循环!!!有了这个思路,我们可以对第一次代码进行初步修改,可得如下代码:
#include<stdio.h>
int main()
{
int ch=0;
while(ch=getchar())
{
putchar(ch+32);
}
return 0;
}
在编译器中输入上式代码,对其进行编译运行后,输入A,得到如图所示的情况:
依次输入A,B,C 后情况如图所示:
此时输出的*,是怎么回事呢?
我们用到了getchar函数去接收字符,并且我们通过键盘进行 输入,而 getchar与键盘之间有一个名为“输入缓冲区”的部分,起初getchar看输入缓冲区,内容为空,然后光标闪烁,等待从键盘输入写东西到输入缓冲区。此时键盘敲一个 A ,此时字符‘A’并没有送给getchar,也没有进入输入缓冲区,此时要按回车去触发getchar去读取字符,此时缓冲区中为'A'与'\n',相当于放入了两个字符,而对于getchar一次只读一个字符,即将'A'读走,因为'A'不为0,所以'A'进入循环,最后输出a。之后getchar再次进行读取,此时缓冲区中余'\n',将'\n'拿走,放入ch中。
通过查ASCII码表可知,'\n'为10,而10+32=42,42对于的字符为'*'。
getchar可以拿走A, getchar也可以拿走\n。
2.0实际版本的代码:
#include<stdio.h>
int main()
{
int ch=0;
while(ch=getchar())
{
putchar(ch+32);
getchar();//读取\n
}
return 0;
}
将上述代码赋值到牛客网题目下,仍然会报错:
此时可知上述代码漏洞: 可以一直输入,停不下来!!!无法读取结束。
getchar函数返回值描述: (补充资料)
代码升级3.0,让代码可以停下来,不至于让其死循环:
#include<stdio.h>
int main()
{
int ch=0;
//EOF--end of file
while((ch=getchar())!=EOF)
{
putchar(ch+32);
printf("\n");//注意换行
getchar();//读取\n
}
return 0;
}
HAPPY ENDING!!!