C++文件三字母单词替换函数失效问题及修复咨询
修复三字母单词替换函数的问题
原代码的核心错误是将整行文本当作单个单词处理,仅判断整行长度是否为3,完全忽略了一行中可能包含多个空格分隔的单词。比如示例输入的行长度远大于3,直接触发了else分支输出原行,根本没执行替换逻辑。
修复方案
需要拆分每行中的独立单词,逐个判断并处理:
- 用
istringstream将每行拆分为单个单词; - 对每个单词单独检查长度是否为3,再判断首字母大小写;
- 保留单词间的空格分隔,保证输出格式与输入一致;
- 处理边缘情况(如空行、首字母非大小写字母的三字母单词)。
修复后的完整代码
#include <sstream> // 必须包含该头文件以使用istringstream void changeThreeLetterWord(ifstream &inStream, ofstream &outStream ){ string line; while (getline(inStream, line)){ std::istringstream lineStream(line); string word; bool isFirstWord = true; // 拆分每行的单词并逐个处理 while (lineStream >> word){ if (!isFirstWord) { outStream << " "; // 单词间添加空格分隔 } isFirstWord = false; if (word.size() == 3) { char firstChar = word[0]; // 转换为unsigned char避免islower/isupper处理负数字符时的未定义行为 unsigned char ucFirst = static_cast<unsigned char>(firstChar); if (isupper(ucFirst)) { outStream << "C++"; } else if (islower(ucFirst)) { outStream << "c--"; } else { outStream << word; // 首字母非大小写字母,保留原单词 } } else { outStream << word; // 非三字母单词,直接保留 } } outStream << endl; // 每行处理完成后换行 } }
关键优化点
- 单词拆分:通过
istringstream实现按空格拆分单词,解决了原代码的核心逻辑错误; - 空格处理:用
isFirstWord标记控制空格输出,保证输出格式与输入一致; - 安全调用:将字符转换为
unsigned char后再调用islower/isupper,避免因字符编码问题触发未定义行为; - 鲁棒性提升:处理了首字母非大小写字母的三字母单词,以及空行场景,避免遗漏或格式错乱。
内容的提问来源于stack exchange,提问作者Ariel Z




