题解 | #大小写转换#
大小写转换
https://www.nowcoder.com/practice/4e089ee8966a4ed4b306f64e68d45264
#include <stdio.h>
int main()
{
while (1)
{
int a = getchar();
if (a != EOF)
{
while (getchar() != '\n');
printf("%c\n",a+32);
}
else
{
break;
}
}
return 0;
}
/*
没看题解 看了才发现 自己写的代码 多么离谱
代码和代码之间也有云泥之别 还是继续努力吧
最开始的想法: getchar()获取字符的ASCII值
打印时 根据ASCII表的规律 大写加上32是小写字母
还得利用 while(getchar()!=0); 来清除缓冲区
然而仅仅如此 只能打印一个字母
于是又想着while循环 这样可以输入多值
到此为止 以为自己想的差不多了哈哈哈
结果就因为简单的逻辑 搞了我很久都在报错
1.一开始没写循环 写了两次输入 中间清除了缓冲区
结果它只输入一个字母 导致后面读空
给我输出了个框 暂时不知道具体是为什么
是空+32得到的吗 我去vs试试
我去vs试了一下 按两下回车才结束
然后读的是第二次的回车 +32后变成*了
不知道为什么一开始牛客 输出的是个框
2.尝试写循环了 但是逻辑关系对我这来说
真的有点绕哈哈哈 我一开始先判断EOF
IF里面在给a赋值。结果是输出*
因为我把int a = getchar();放在了if内
int a = getchar(); 应该放在 if 语句之外,
放在里面的话if (getchar() != EOF) 调用了一次 getchar()
但是没有存储返回的字符。
紧接着 int a = getchar(); 又调用了一次
实际上应该使用第一次调用的结果。
即第一个 getchar() 调用的结果是被丢弃的,
而第二个 getchar() 调用实际上读取了下一个字符。
这意味着第一个字符被忽略了
此时程序只会处理从第二个字符开始的输入。
这样会导致什么呢?哈哈哈就是*吗
总结错误在于:
if (getchar() != EOF) 这行代码读取了第一个字符,但没有存储,直接用于EOF检查。
int a = getchar(); 这行代码实际上读取了第二个字符,并将其存储在变量 a 中。
while (getchar() != '\n'); 这个循环会读取并丢弃从当前位置到换行符的所有字符
这意味着 会读取 从第一个字符到\n 之间的第二个字符
所以正确思路大概是:
1.首先读取字符
2.然后检查是否为EOF。
3.如果不是EOF,检查字符是否为大写字母,如果是,则转换为小写字母。
4.输出当前字符。
5.重复上述步骤直到读取到EOF。
反过来想 这错的思路也能用来读第二个字符吗 是不是
如果出个题 让我读第二个字符我会怎么做呢?
其实还是不推荐的 应该有更好的思路
(原本错误的思路是 if (getchar() != EOF) 读取并丢弃了一个字符。
然后 int a = getchar(); 读取了第二个字符。)
试试?
int main()
{ while(1)
{
int firstChar,a;
firstChar = getchar();// 读取第一个字符,但不使用它
if (firstChar != EOF) // 检查是否到达文件结束
{
a = getchar();// 读取第二个字符
while (getchar() != '\n');//清除缓冲区
if (a >= 'A' && a <= 'Z') // 处理第二个字符
{
a = a + 32; // 转换为小写
}
printf("%c\n", a);//打印
}
else
break;
}
return 0;
}
挺麻烦的 这段代码问题还是比较多的 因为工作原因也只能先到这了 后面有时间再来吧
*/

