Удаление слов которые начинаются на гласную букву
Я пытался сделать удаление которые начинаются на гласную букву , но мой код не удаляет вообще . В чем может быть проблема? Прошу прошения, если вопрос выглядит плохо оформленным.
#include<iostream>
#include<string>
using namespace std;
void DeleteVowels(char words[]);
int main()
{
char words[255];
cout << "Enter words separated by space:";
gets_s(words);
DeleteVowels(words);
cout << "Line view after deleting words:";
puts(words);
return 0;
}
void DeleteVowels(char words[])
{
char vowels[13] = "AaEeIiOoUuYy";
int counter = 0, i = 0, j = 0;
int startwords, endwords;
for (i = 0; words[i]; i++)
{
if (words[i] == ' ' || words[i] == '\0')
{
while (words[i] == ' ') i++;
startwords = i;
while (words[i] != ' ' && words[i] != '\0') i++;
while (words[i] == ' ') i++;
endwords = i;
for (j = 0; vowels[j]; j++)
{
if (startwords == vowels[j])
{
strcpy(&words[startwords], &words[endwords]);
}
}
i -= endwords - startwords + 1;
}
}
}
Ответы (2 шт):
Автор решения: AlexGlebe
→ Ссылка
Ну не удаляет, потому-что вы сравниваете индекс с буквами
if (startwords == vowels[j])
скорее всего надо так :
if ( words[startwords] == vowels[j])
Копирование букв друг на друга приведёт к неопределённости.
strcpy(&words[startwords], &words[endwords]);
Делать нужно функцией memmove :
memmove(&words[startwords] , &words[endwords] , strlen(&words[endwords])+1);
Автор решения: Павел Ериков
→ Ссылка
Вот пример работающего кода:
void DeleteVowels(char words[])
{
char vowels[13] = "AaEeIiOoUuYy";
int counter = 0, i = 0, j = 0;
int startwords, endwords;
int len = strlen(words);
for (i = 0; words[i];)
{
while (words[i] == ' ') i++;
startwords = i;
while (words[i] != ' ' && words[i] != '\0') i++;
while (words[i] == ' ') i++;
endwords = i;
for (j = 0; vowels[j]; j++)
{
//Сравниваем первую букву слова с буквой из массива, а не индекс этой буквы
if (words[startwords] == vowels[j])
{
//Копируем всю строку за найденым словом вперед, тем самым затираем найденное слово
memmove(&words[startwords], &words[endwords], len - endwords + 1);
//Корректируем индекс т.к. теперь длина строки изменилась
i -= endwords - startwords;
//Корректируем длину строки (по подсказке AlexGlebe)
len -= endwords - startwords;
//Нет смысла продолжать циклу пробегать по массиву букв
break;
}
}
}
}
Для примера я вводил строчку: Abc defgh ijklmn O pqRsTu vWx Yz
И получал такую: defgh pqRsTu vWx