You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动