牛客网 BC28-大小写转换(你好,2022)

题目描述

实现字母的大小写转换。多组输入输出。

输入描述:

多组输入,每一行输入大写字母。

输出描述:

针对每组输入输出对应的小写字母。 

示例1

输入

A
B

输出

a

思路:当看到这个题时,通过“大小写转换”可以立马反应出,通过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,得到如图所示的情况:牛客网 BC28-大小写转换(你好,2022)

依次输入A,B,C  后情况如图所示:牛客网 BC28-大小写转换(你好,2022)

此时输出的*,是怎么回事呢?

我们用到了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对于的字符为'*'。

牛客网 BC28-大小写转换(你好,2022)


getchar可以拿走A,   getchar也可以拿走\n。

2.0实际版本的代码:

#include<stdio.h>
int main()
{
  int ch=0;
  while(ch=getchar())
  {
    putchar(ch+32);
    getchar();//读取\n
  }
  return 0;
}

 将上述代码赋值到牛客网题目下,仍然会报错:

 牛客网 BC28-大小写转换(你好,2022)

此时可知上述代码漏洞: 可以一直输入,停不下来!!!无法读取结束


getchar函数返回值描述: (补充资料)

牛客网 BC28-大小写转换(你好,2022)

 代码升级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;
}

牛客网 BC28-大小写转换(你好,2022) 

 HAPPY ENDING!!!

 

 

上一篇:abc 选做


下一篇:用getchar函数消除scanf最后输入的回车,以实现两个scanf并用