如何修复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
相关产品推荐
相关产品推荐

