从一组包含3个元音字母的单词中删除单词

时间:2015-04-16 13:45:53

标签: c++ arrays dynamic letters

我正在努力:

  

从一组单词中删除任何单词(-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)!=

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_tokrealloc(您可以通过在其上复制字母并使用\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';
}