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

如何修复C++字符串大小写互换程序输出整数、乱码的问题

问题原因
  • tolower/toupper返回值类型问题:这两个函数来自C标准库,返回值为int类型,返回的是字符对应的ASCII码数值,而非char类型。直接输出时std::cout会按整数类型打印数值,不会输出对应字符,需要手动强转为char类型才能输出字符。
  • 错误使用sizeof获取字符串长度:std::string是容器类,sizeof(str)获取的是std::string对象本身的内存大小(通常是固定值,比如64位环境下为24字节),和字符串实际存储的字符长度完全无关。要获取字符串实际长度应该调用str.size()或str.length()方法。
  • 循环越界访问:你写的循环条件是i<=sizeof(str),首先长度判断依据错误,其次哪怕用正确的长度,循环条件应该是i < 字符串长度,下标从0开始到长度-1结束,<=会访问到下标等于长度的越界地址,后面输出的乱码数值就是越界访问到的非法内存垃圾值。
  • 函数声明与实现不符:你声明toggle函数返回std::string,但函数体内没有任何return语句,属于未定义行为,要么将返回值改为void,要么处理完字符串后返回结果。
  • 头文件引用错误:使用std::string需要引用<string>头文件而非C语言的<string.h>;isupper/tolower等字符处理函数需要引用<cctype>头文件,否则可能出现未定义行为。
修正后的参考代码
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib> // 用于exit函数

std::string toggle(std::string str)
{
    const int maxsize = 100;
    if (str.size() > maxsize)
    {
        std::cout << "Size of string is too big!" << std::endl;
        exit(1);
    }
    for (int i = 0 ; i < str.size() ; i++)
    {
        if (isupper(str[i]))
        {
            str[i] = tolower(str[i]);
            std::cout << "UPPER CASE CONVERTED TO LOWER CASE "<< (char)str[i] << std::endl;
        }
        else if (islower(str[i])) // 跳过空格等非字母字符
        {
            str[i] = toupper(str[i]);
            std::cout << "LOWER CASE CONVERTED TO UPPER CASE "<< (char)str[i] << std::endl;
        }
    }
    return str;
}

int main()
{
    std::string result = toggle("Hello This Is A Test");
    std::cout << "转换后的完整字符串:" << result << std::endl;
    return 0;
}

内容的提问来源于stack exchange,提问作者CodingIsFun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:36:04