为何输入Hello无法输出hello?C++字符串转小写问题求助
问题原因及解决方法
核心问题分析
空字符串下标访问越界
你初始化了string z{};,这是一个长度为0的空字符串。直接通过z[i]赋值会访问超出字符串内存范围的位置,属于未定义行为,程序可能输出乱码、崩溃或者毫无输出。大写判断条件错误
你的判断if(f[i]>'A' && f[i]<='Z')会漏掉字符'A',导致大写的'A'无法被转换为小写。硬编码ASCII值不规范
直接加32来转小写依赖ASCII编码规则,虽然大部分系统兼容,但不是标准做法,在非ASCII编码环境下会出错。
修复后的代码方案
方案1:提前分配字符串空间 + 修正判断逻辑
先给z分配和f一样的长度,再逐个赋值:
#include <iostream> #include <string> using namespace std; int main(){ string f = "Hello"; string z(f.size(), ' '); // 提前分配与f相同的空间 for(int i = 0; i < f.size(); i++){ if(f[i] >= 'A' && f[i] <= 'Z'){ // 修正判断条件,包含'A' z[i] = f[i] + 32; } else { z[i] = f[i]; } } cout << z << endl; }
方案2:用push_back动态添加字符(更安全)
不需要提前分配空间,每次转换后把字符添加到z末尾:
#include <iostream> #include <string> using namespace std; int main(){ string f = "Hello"; string z; for(char c : f){ // 用范围for循环更简洁 if(c >= 'A' && c <= 'Z'){ z.push_back(c + 32); } else { z.push_back(c); } } cout << z << endl; }
方案3:使用标准库tolower函数(推荐,跨平台)
利用C标准库的tolower函数,需要注意把字符转为unsigned char避免负数问题:
#include <iostream> #include <string> #include <cctype> // 包含tolower的头文件 using namespace std; int main(){ string f = "Hello"; string z; for(char c : f){ z.push_back(tolower(static_cast<unsigned char>(c))); } cout << z << endl; }
内容的提问来源于stack exchange,提问作者user910032
相关产品推荐
相关产品推荐

