Удаление слов из набора слов, которые содержат 3 гласные буквы подряд

Я пытаюсь:

удалить любое слово (-я) из набора слов, которое начинается с 3 гласных букв подряд.

Я делал это на Embarcadero RAD Studio XE, используя C ++ Builder, и это должно работать так: набор слов вводится в текстовое поле, и после нажатия кнопки программа должна выполнить алгоритм и напечатать результат во втором тексте. коробка.

Вот что у меня так далеко:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString text=Form1->Textbox1->Text;
int position=0, i=0;
char *str=text.c_str(), *space=" ",
*word=strtok(str,space), *word_array;
word_array=(char*)malloc(sizeof(char));
if (word_array==NULL) {
exit (0);
}
else
{
while (word!=NULL)
{
if (word.substr(i,i+3)!= //ERROR: Structure required on left side of . or .*
"AAA"||"aaa"||"EEE"||"eee"||
"III"||"iii"||"YYY"||"yyy"||
"OOO"||"ooo"||"UUU"||"uuu") {
word_array=(char*)realloc(word_array, strlen(word)*sizeof(char));
word_array[position]=*word;
position+=1;
}
word=strtok(NULL,space);
}
}
}

Я испытываю только одну ошибку в этой строке: if (word.substr(i,i+3)!=

1

Решение

просто используйте регулярные выражения

#include <regex>

...

if (regex_search(s, "[aeiouyAEIOUY]{3}")) {
word = null;
}

Руководство по регулярным выражениям для C ++: http://www.informit.com/articles/article.aspx?p=2079020

3

Другие решения

Согласно этой линии,

char *str=text.c_str(), *space=" ", *word=strtok(str,space), *word_array;

word это указатель на char, Однако здесь:

if (word.substr(i,i+3)!=

Вы пытаетесь позвонить substr функция на нем, который на самом деле является частью std::basic_string (не говоря уже о том, что вы должны использовать -> вместо . для членского доступа по указателям). Так что вам нужно что-то вроде:

std::string wordString(word);
if(wordString.substr(i, i+3) <...>
1

Ваша главная проблема в том, что word имеет тип char* и поэтому вы не можете позвонить substr() в теме.


В целом проблема, которую вы представили, требует гораздо более простого решения. Не нужно использовать str_tok или же realloc (Вы можете удалить слово, скопировав на него буквы и заканчивая ранее \0).

char* версия:

bool has3VowelsStartingWord(const char *sentence, int &size) {
const char space = ' ';

for (int i = 0; i < size; ++i) {
if (sentence[i] == space && i + 3 < size &&
isVowel(sentence[i + 1]) && isVowel(sentence[i + 2] &&
isVowel(sentence[i + 3]) {
// delete word (move letters, decrement i & update size)
}
}
}

string версия:

bool delete3VowelsStartingWord(const std::string &sentence) {
char space = ' ';

for (size_t i = 0; i < sentence.size(); ++i) {
if (sentence[i] == space && i + 3 < size &&
isVowel(sentence[i + 1]) && isVowel(sentence[i + 2] &&
isVowel(sentence[i + 3]) {
// find end of word to delete.
size_t j = i + 1;
for (; j < sentence.size(); ++j) {
if (sentence[j] == space) {
break;
}
}
sentence.erase(i, j - i);
--i; // decrement i to point to the next word's pre-space.
}
}
}

А также isVowel функция:

bool isVowel(char c) {
return c == 'a' || c == 'e' ||c == 'i' ||c == 'o' ||c == 'u' ||
c == 'A' || c == 'E' ||c == 'I' ||c == 'O' ||c == 'U';
}
1
По вопросам рекламы [email protected]