C++代码输出重复字符问题排查(已找到修复方案)
问题分析与修复
你的代码输出出现重复字符(如预期SuCh却得到SSuuCChh),核心问题和修复方案如下:
1. 冗余的条件判断破坏逻辑
第三个分支的else if(L%1==0)完全多余——任何整数对1取模结果都是0,这个条件永远为真,完全可以直接替换成else,让逻辑更清晰:当L为奇数时自动执行小写转换。
从你提供的代码来看,循环本身是每个字符处理一次,但如果实际运行的代码中误将else if写成了独立的if,就会导致每个字符被两次输出(先执行大写分支,再执行小写分支),最终出现重复字符的情况。
2. 空格处理逻辑存在隐患
你当前处理空格时执行L = L - 2,试图抵消之前的两次L++,但如果空格出现在字符串开头或连续出现,会导致L变成负数,破坏后续的大小写交替规则。如果希望空格不打断交替节奏,直接输出空格且不修改L即可;如果需要每个单词重新开始交替,则将L重置为0。
修复后的代码
#include <cctype> #include <iostream> #include <string> // 显式包含string头文件,避免编译器依赖 using namespace std; int main() { string mani; int L = 0; getline(cin, mani); for (int i = 0; i < mani.length(); ++i) { if (mani.at(i) == ' ') { cout << ' '; // 若需每个单词重新交替,替换为 L = 0; } else if (L % 2 == 0) { // 强制转换为unsigned char,避免有符号char的未定义行为 putchar(toupper(static_cast<unsigned char>(mani.at(i)))); ++L; } else { putchar(tolower(static_cast<unsigned char>(mani.at(i)))); ++L; } } return 0; }
关键说明
- 替换冗余的
else if(L%1==0)为else,消除逻辑歧义。 - 添加
static_cast<unsigned char>避免toupper/tolower处理有符号字符时的未定义行为。 - 调整空格处理逻辑,根据需求选择保持交替节奏或重置计数。
内容的提问来源于stack exchange,提问作者Paul Martinez
相关产品推荐
相关产品推荐

