C++中pop_back()相关问题:元音反转替换程序输出异常
问题分析与修复
你的代码存在两个关键问题,导致输出不符合预期:
1. 向量初始化错误
你初始化向量时使用std::vector<char> v(text.length());,这会创建一个包含text.length()个默认空字符'\0'的向量。后续push_back操作是在这些空字符之后追加元音,导致向量前半部分全是空字符。当你调用v.back()时,前几次能取到正确的元音,但元音耗尽后,后续会取到空字符,直接导致原元音位置被替换为空,出现tst rn这类截断效果。
修复:将向量初始化为空即可:
std::vector<char> v;
2. 元音替换时重复处理
替换元音的内层循环中,当你把原元音替换成另一个元音(比如o换成u)后,内层循环会继续遍历vocals数组,此时替换后的字符(u)也会匹配到vocals中的元素,导致同一位置被重复替换,额外消耗向量中的元音元素,彻底打乱替换顺序。
修复:找到匹配的元音并完成替换后,立即跳出内层循环,避免重复处理:
if (text[i] == vocals[j]) { text[i] = v.back(); v.pop_back(); break; // 跳出内层循环,防止重复替换 }
修复后的完整代码
#include <iostream> #include <string> #include <vector> int main() { std::string text; char vocals[] = {'a', 'i', 'u', 'e', 'o', 'A', 'I', 'U', 'E', 'O'}; std::cout << "input the text: "; std::getline(std::cin, text); // 初始化空向量存储元音 std::vector<char> v; // 收集所有元音,优化为范围for循环 for (char c : text) { for (char vocal : vocals) { if (c == vocal) { v.push_back(c); break; // 找到元音后跳出内层循环,提升效率 } } } // 替换元音为反转后的顺序 for (char& c : text) { for (char vocal : vocals) { if (c == vocal) { c = v.back(); v.pop_back(); break; // 避免重复替换 } } } std::cout << "the new text is: " << text << std::endl; return 0; }
测试验证
输入"vocal switch test run"时,收集到的元音列表是[o, a, i, e, e, u],反转后为[u, e, e, i, a, o],替换后的正确输出为:
vucel swetch tast ron
内容的提问来源于stack exchange,提问作者rafiafnaanf
相关产品推荐
相关产品推荐

