C ++ код для вставки пары символов после каждого гласного строки, вставленной пользователем - PullRequest
0 голосов
/ 03 июля 2018

Пожалуйста, помогите сделать этот код вставленным 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;
}

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Я бы сделал:

bool is_vowel(char cc)
{
    const char c = tolower(cc);
    return
        c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == ä || c == ö;
}

... и все другие возможные гласные с ударением. Тогда:

int main()
{
    std::string s;
    std::cin >> s;

    std::string ss;

    for (const char c: s)
    {
        ss += c;

        if (is_vowel(c))
            ss += "ob";    
    }

    std::cout << ss << std::endl
}
0 голосов
/ 13 октября 2018

Попробуйте что-нибудь более подобное вместо этого. Он использует индексы вместо итераторов и позволяет std::string обрабатывать поиск и сравнения вместо вас, делая их вручную:

#include <iostream>
#include <string>

int main()
{
    const std::string vowels = "aAeEiIoOuU";
    const std::string o = "ob";

    std::string s;
    std::cin >> s;

    auto i = s.find_first_of(vowels);
    while (i != std::string::npos)
    {
        s.insert(++i, o);
        i = s.find_first_of(vowels, i + o.size());
    }

    std::cout << s << std::endl;
}

Live Demo

0 голосов
/ 03 июля 2018

Я не буду упоминать ошибки, упомянутые в комментариях.

Я бы не пытался манипулировать той же самой строкой, в которой выполняется поиск.

В частности, для цикла 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...