如何实现字符串辅音间元音复制并解决C++ insert编译报错问题
错误原因分析
- insert函数参数不匹配:你调用的
i.insert(j+1, i[j])中,第二个参数是char类型,但C++std::string的insert重载没有直接接收【位置+单个字符】的版本,正确的插入单个字符的重载需要传入三个参数:插入位置、插入数量、待插入字符,所以编译器找不到匹配的重载,触发报错。 - 边界判断的隐性问题:你用
vo.find(xxx) >= i.length()判断是否为辅音,虽然运行时大概率没问题,但不符合规范:string::find查找失败时返回的是固定值string::npos,和当前字符串长度没有关联,极端场景下会出现逻辑错误。 - 循环长度固定问题:你初始化
n = i.size()之后,循环条件用固定的n做判断,但插入字符会让字符串长度变长,虽然当前需求场景下不会触发逻辑错误,但属于代码隐患。
修复方案
快速修复现有代码
只需要调整insert的参数,同时优化判断逻辑即可:
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); using namespace std; void solution(){ string i; cin >> i; string vo = "aeuio"; // 循环条件动态取当前字符串长度,避免插入后越界 for(int j=1; j < (int)i.size() -1; j++){ // 用string::npos判断查找失败,逻辑更严谨 if(vo.find(i[j-1]) == string::npos && vo.find(i[j]) != string::npos && vo.find(i[j+1]) == string::npos){ // 调整insert参数,中间加1表示插入1个对应字符 i.insert(j+1, 1, i[j]); // 插入后多了一个字符,j跳过刚插入的元音,避免重复判断 j++; } } cout << i << endl; } int main(){ ios int t; cin >> t; while(t--){ solution(); } return 0; }
更稳妥的实现方案(避免操作原字符串索引)
直接遍历原字符串构建新结果,不需要处理插入带来的索引变化问题,逻辑更清晰:
#include<bits/stdc++.h> #define ios ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); using namespace std; bool is_vowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'; } void solution(){ string s; cin >> s; string res; int n = s.size(); for(int j=0; j < n; j++){ res += s[j]; // 只有不是首尾字符,且当前是元音、左右都是辅音的情况下,多追加一次当前字符 if(j > 0 && j < n-1 && is_vowel(s[j]) && !is_vowel(s[j-1]) && !is_vowel(s[j+1])) { res += s[j]; } } cout << res << endl; } int main(){ ios int t; cin >> t; while(t--){ solution(); } return 0; }
两个版本都可以正确实现需求:输入informatics输出infoormaatiics。
内容的提问来源于stack exchange,提问作者youssef
相关产品推荐
相关产品推荐

