You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何输入Hello无法输出hello?C++字符串转小写问题求助

问题原因及解决方法

核心问题分析

  1. 空字符串下标访问越界
    你初始化了string z{};,这是一个长度为0的空字符串。直接通过z[i]赋值会访问超出字符串内存范围的位置,属于未定义行为,程序可能输出乱码、崩溃或者毫无输出。

  2. 大写判断条件错误
    你的判断if(f[i]>'A' && f[i]<='Z')会漏掉字符'A',导致大写的'A'无法被转换为小写。

  3. 硬编码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:35:05