Не работает программа. Необработанное исключение
Нужно написать программу, которая бы подсчитывала выполнение условия: последняя буква очередного слова совпадает с первой буквой следующего слова
#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 шт):
Автор решения: 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;
}