You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何使用string::insert在句子每个元音前插入字符串CH

问题背景

实现目标:遍历输入字符串,在每一个小写元音字母(a/e/i/o/u/y)前插入固定字符串"CH",要求使用string::insert方法完成逻辑,现有循环插入代码运行结果不符合预期。
原有问题代码:

string message = "you have a secret message to decrypt";
    string newMessage = "";
    string InsertMessage = "CH";

    for (int i = 0; i < message.length(); i++) {
        if (
            message[i] == 'a' ||
            message[i] == 'e' ||
            message[i] == 'i' ||
            message[i] == 'o' ||
            message[i] == 'u' ||
            message[i] == 'y')
        {
            //newMessage = message.replace(i, 1, InsertMessage);
            newMessage = message.insert(i, InsertMessage);
        }
    }

    cout << newMessage << endl;

    return 0;
错误原因
  • string::insert会直接修改调用该方法的原字符串,插入2个字符后字符串长度会增加2,但原有循环的索引i每次固定自增1,会导致遍历到刚插入的"CH"字符,触发重复插入,最终结果错乱,甚至引发死循环。
  • 初始声明空字符串newMessage、每次将insert返回值赋值给该变量属于多余操作:insert返回的是修改后原字符串的引用,不需要额外变量承接中间结果。
  • 插入后未调整索引偏移量:在位置i插入2个字符后,原本位于i位置的元音会移动到i+2位置,按原逻辑递增i会导致后续判断位置错位,无法正确遍历原字符串的剩余字符。
修正代码

写法1:直接调用insert修改原字符串(匹配使用insert方法的需求)

核心是调整循环索引的递增逻辑,插入后跳过刚插入的内容和当前已处理的元音,避免重复判断:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string message = "you have a secret message to decrypt";
    string insertStr = "CH";

    for (int i = 0; i < message.length(); ) {
        char curr = message[i];
        if (curr == 'a' || curr == 'e' || curr == 'i' || curr == 'o' || curr == 'u' || curr == 'y') {
            message.insert(i, insertStr);
            // 插入内容长度为2,当前元音移动到i+2位置,下一次从i+3开始遍历,跳过插入内容和当前元音
            i += insertStr.size() + 1;
        } else {
            // 非元音字符直接后移一位
            i++;
        }
    }

    cout << message << endl;
    return 0;
}

写法2:新字符串逐字符拼接(初学者推荐,逻辑更简单)

不需要处理索引偏移问题,遍历原字符串的每个字符,遇到元音先拼接"CH"再拼接当前字符,非元音直接拼接字符即可,逻辑直观不易出错:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string message = "you have a secret message to decrypt";
    string newMessage = "";
    string insertStr = "CH";

    // 直接遍历原字符串,不会受插入操作影响
    for (char c : message) {
        if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y') {
            newMessage += insertStr;
        }
        newMessage += c;
    }

    cout << newMessage << endl;
    return 0;
}
运行结果

两种写法输出一致,结果为:
CHyoCHu CHhavCHe aCH seCHcrCHet mesCHsaCHge tCHo deCHcrCHypt

内容的提问来源于stack exchange,提问作者Yukiliam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.15 16:16:01