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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:53:14