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
相关产品推荐
相关产品推荐

