Не работает программа. Необработанное исключение

Нужно написать программу, которая бы подсчитывала выполнение условия: последняя буква очередного слова совпадает с первой буквой следующего слова

#include <iostream>
#include <cstring>
#include <string>
#pragma warning(disable : 4996)

using namespace std;
int main() {
char arr[22];
string a = "hello own now wow now";
strcpy(arr, a.c_str());
int k=0;
for (int i = 0; i < 22; i++)
{
    cout << arr[i];
}
for (float i = 0; i < 22; i++)
{
    if ((a[i] == a[i + 2]) && (a[i + 1] == '  '))
        k = k + 1;
}
cout << k;
return 0;

}


Ответы (3 шт):

Автор решения: 0x25

a[i + 2] при i = 21 обращается к a[23], но размер a меньше.

→ Ссылка
Автор решения: darcinc

Вот рабочий вариант.Возможно стоит прикрутить сюда и возможность динамически определять размер массива, и вводить слова руками, но мне лень.

#include <iostream>
#include <cstring>
#include <string>
#pragma warning(disable : 4996)

using namespace std;
int main() 
{
char arr[22];
char b = ' ';
string a = "hello own now wow now";
strcpy(arr, a.c_str());
int k = 0;
for (int i = 0; i < 22; i++)
{
    cout << arr[i];
}
for (int i = 2; i < 22; i++)
{
    if ((a[i] == a[i - 2])&&(a[i-1]==b))
    {
        k = k + 1;
    }
}
cout <<endl<< k;
return 0;
}
→ Ссылка
Автор решения: Maggot

Можно попробывать не привязываться к массивам в взять итераторы, да и разбить задачу на части, к примеру - разбить строку на слова, найти кол-во выполненых условий

Много путей решения - вот 2 (мудреное и нет)

Вот банальный пример (много в нем лишнего - но имеет место на жизнь):

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <sstream>

std::vector<std::string> SeparateLine(std::string& line) noexcept {

  std::vector<std::string> ret;
  
  std::istringstream ist(line);
  std::string tmp_str;

  while (ist >> tmp_str) {
    ret.push_back(tmp_str);
  }

  return ret;
}

std::size_t CountOfWords(std::vector<std::string>& dict) noexcept {

  if (dict.empty() || 1 == dict.size()) {
      return 0;
  }

  std::size_t ret{0};

  auto it{std::begin(dict)};

  while ((std::end(dict) - 1) != it) {
    if (*std::rbegin(*it) == *std::begin(*(it + 1))) {
      ++ret;
    }
    ++it;
  }

  return ret;
}

int main() {
  
  std::string line{"ab bc be ef aa ac"};

  auto dict{SeparateLine(line)};

  std::size_t ret{CountOfWords(dict)};

  std::cout << ret << std::endl;

  return 0;
}

Или вообще не париться и просто прикапывать старое слово и сравнивать в одном цикле (решение в лоб)

#include <iostream>
#include <string>
#include <sstream>

int main() {
  
  std::string line{"ab bc be ef aa ac"};

  std::istringstream ist(line);
  std::string tmp_str, last_word;
  
  std::size_t count{0};

  while (ist >> tmp_str) {
    if (last_word == "") {
      last_word = tmp_str;
      continue;
    }
    if (*std::rbegin(last_word) == *std::begin(tmp_str)) {
      ++count;
    }
    last_word = tmp_str;
  }

  std::cout << count << std::endl;

  return 0;
}
→ Ссылка