题解 | #大小写转换#
大小写转换
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; } 挺麻烦的 这段代码问题还是比较多的 因为工作原因也只能先到这了 后面有时间再来吧 */