我正在努力:
从一组单词中删除任何单词(-s),单词以一行中的3个元音字母开头。
我一直在使用C ++构建器在Embarcadero RAD Studio XE上执行此操作,这应该是这样的:在文本框中输入一组单词,按下按钮后,程序应该执行算法并打印结果第二个文本框。
这是我到目前为止所得到的:
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)!=
答案 0 :(得分:3)
只需使用正则表达式
#include <regex>
...
if (regex_search(s, "[aeiouyAEIOUY]{3}")) {
word = null;
}
c ++的正则表达式指南:http://www.informit.com/articles/article.aspx?p=2079020
答案 1 :(得分:1)
按照这一行,
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) <...>
答案 2 :(得分: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';
}