c++ - 在用户插入的字符串的每个元音之后插入一对字符的 C++ 代码
问题描述
请协助将此代码插入ob
用户在 C++ 中输入的字符串中的每个元音之后。该代码ob
仅在第一个元音之前添加一个双精度。谢谢。
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string s;
std::cin >> s;
std::string o ="ob";
for (char& v: s)
{
if (v == 'a' || v=='e' || v == 'i' || v == 'o' || v == 'u')
s = s.insert(s.find(v),o);
}
std::cout << s << std::endl;
}
解决方案
我不会提及评论中提到的错误。
我会避免尝试操作正在搜索的相同字符串。
特别是使用迭代器的基于范围的 for 循环。迭代器可能会通过更改底层集合而失效,这通常与动态内存(重新)分配同时发生。我不知道字符串迭代器是如何工作的,但我猜想随着字符串的增长,你的迭代器会失效。
我会创建第二个字符串,扫描第一个字符串以确定有多少元音,并立即保留那么多空间。这需要对第一个字符串进行两次迭代,但您最多只能调用一次堆分配。
然后简单地遍历第一个字符串并填充第二个。
#include <iostream>
#include <string>
#include <algorithm>
bool is_vowel(char c)
{
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
int main()
{
const std::string vowel_postfix = "ob";
std::string in, out;
std::cin >> in;
auto vowel_count = std::count_if(in.begin(), in.end(), is_vowel);
out.reserve(in.length() + vowel_count * 2);
for (char c : in) {
out.push_back(c);
if (is_vowel(c))
out.insert(out.length(), vowel_postfix);
}
std::cout << out << std::endl;
}
推荐阅读
- linux - 在 Windows 主机上的 Linux 客户机中创建符号链接
- postgresql - 您可以使用 AWS DMS 将 Aurora DB 从一个账户移动到另一个账户吗?
- scala - 将代码合并到一个循环中的正确方法是什么?
- javascript - 如何使 render() 中的函数等待组件挂载
- postgresql - PostgreSQL - 使用另一个表中的先前值更新表
- c# - SSH.NET 实时记录高 CPU
- r - 将由两列与 ggplot2 分面的刻面标签图在 r 中合并
- git - 禁止关于默认初始分支名称的 git 警告
- object-detection - 如何为 YOLO 生成自定义数据的标签
- arrays - 在 Go 中重复数组项