首页 > 解决方案 > 在用户插入的字符串的每个元音之后插入一对字符的 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;
}

标签: c++c++11visual-c++

解决方案


我不会提及评论中提到的错误。

我会避免尝试操作正在搜索的相同字符串。

特别是使用迭代器的基于范围的 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;
}

推荐阅读