Я пытаюсь:
удалить любое слово (-я) из набора слов, которое начинается с 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)!=
просто используйте регулярные выражения
#include <regex>
...
if (regex_search(s, "[aeiouyAEIOUY]{3}")) {
word = null;
}
Руководство по регулярным выражениям для C ++: http://www.informit.com/articles/article.aspx?p=2079020
Согласно этой линии,
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) <...>
Ваша главная проблема в том, что 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';
}