C++中使用指针递归转换字符数组大写字母为小写失败求助
问题分析与修复方案
咱们先看看你代码里的核心问题——递归终止条件写反了!
你当前的第一个判断:
if ( *input ) { cout << input << endl; return; }
这个逻辑是:只要当前字符不是空字符(也就是还没到字符串末尾),就直接return退出函数。这意味着程序刚进入all_lower,看到第一个字符'T'非空,就直接输出原字符串并终止了,后面的大写转小写代码根本没机会执行!这就是为什么输出还是原字符串的原因。
修复后的代码
#include <iostream> #include <string> // 引入cctype头文件,使用标准的tolower函数更稳妥 #include <cctype> using namespace std; void all_lower(char* input) { // 正确的终止条件:遇到字符串结束符'\0'才停止递归 if (*input == '\0') { return; } // 判断是否为大写字母,进行转换 if (*input >= 'A' && *input <= 'Z') { *input = tolower(*input); // 如果你偏好手动修改ASCII值,也可以写成 *input += 32; } // 输出当前处理后的字符 cout << *input; // 递归处理下一个字符 all_lower(input + 1); } int main() { char test[] = "Test"; all_lower(test); cout << endl; // 额外输出整个转换后的字符串验证结果 cout << "最终转换结果:" << test << endl; return 0; }
关键修复点
- 修正递归终止逻辑:只有当
*input等于'\0'(字符串结束标记)时才终止递归,这样才能逐个遍历并处理每个字符。 - 可选鲁棒性优化:用标准库的
tolower()函数代替手动加32,这个函数会适配不同字符集的大小写转换规则,比硬编码ASCII偏移更通用。 - 调整输出方式:原代码直接输出整个字符串的逻辑会打断递归流程,改成逐个输出字符或最后统一输出结果,更符合递归处理的预期。
运行修复后的代码,输入"Test"会输出"test",完全符合你想要的大写转小写效果。
内容的提问来源于stack exchange,提问作者Tanveer Salim
相关产品推荐
相关产品推荐

