1

在我的项目中,我从用户那里获取一个字符串,然后我需要检查元音 a、e、I、O、U 是否存在。如果是这样,我必须找出字符串中哪个排在第一位,然后哪个排在后面。例如,如果用户输入如下内容:

char expr[] = "this is for something real";

我先来,然后是我,然后是 O,以此类推。我使用 . 检查了字符是否在字符串中strchr(expr,'character here')。为了找到哪个字符先出现,我使用找到每个字符的索引

const char *ptr = strchr(expr, characters here);
if(ptr) {
    int index = ptr - expr;
}

之后我检查哪个索引更大。但这是一个非常漫长的过程。有没有更聪明的方法来做到这一点?

4

3 回答 3

1

这可以很容易地通过简单地迭代输入表达式并注意何时遇到目标字母来完成。这是一种按照元音在输入表达式中出现的顺序C++11填充 a的方法。std::vector如果您只需要将它们打印出来,那么就不要填充results向量(而是打印它们)。

char expr[] = "this is for something real";
std::vector<char> results;

std::for_each(
    expr,
    expr + strlen(expr),
    [&results] (const char c)
{
   switch(c)
   {
   case 'a':
   case 'A':
   case 'e':
   case 'E':
   case 'i':
   case 'I':
   case 'o':
   case 'O':
   case 'u':
   case 'U':
      results.push_back(c);
   }
});
于 2012-06-20T02:56:16.220 回答
1

如果您不需要原始字符串中的位置,而只需要顺序,则可以使用std::remove_copy_if检测非元音字符的仿函数(即元音返回 true):

 std::string only_vowels;
 std::remove_copy_if( std::begin(expr), std::end(expr),
                    std::back_inserter(only_vowels),
                    []( char ch ) { char upper = toupper(ch);
                                    return upper!='A' 
                                          && upper!='E'
                                          && upper!='I'
                                          && upper!='O'
                                          && upper!='U'; } );

(使用 C++11 特性来获取迭代器和 lambda 而不是创建函子,但同样可以用 C++03 编写一些额外的样板代码。代码未经测试)

算法完成后,only_vowels将仅包含原始字符串中存在的元音,并按照它们出现的确切顺序。算法不修改大小写。

或者,您可以手动迭代字符串中的元素,并测试每个字符以查看它是否是元音,然后打印它或做任何需要做的事情。如果这是家庭作业,那么这可能就是你所期望的。

于 2012-06-20T03:12:34.377 回答
0

这是一种方法,可以为您提供找到的字符以及索引(自动排序)。它还利用了一些 C++ 特性,而不是 C:

int main() {
    std::string expr = "this is for something real";
    std::string toCheck = "AaEeIiOoUu"; //checking for these letters
    std::map<int, char> indices; //stores index-character pairs

    for (char c : toCheck) { //go through each char in string (ranged-for, C++11)
        if (expr.find (c) != std::string::npos)
            indices [expr.find (c)] = c; //map sorts itself by key
    }

    for (const auto &element : indices) { //print results
        std::cout << "'" << element.second << "'" 
            << " found at index " << element.first << '\n';
    }
}

我不确定它是否提供了您需要的任何其他内容而不是大卫的回答,但这是一种方法,并且确实允许提取更多信息。但是,当前代码只会为您提供每个代码的第一次出现。我不确定你是想要全部还是第一个,但它是适应性强的。不过,在这一点上,大卫的回答非常适合。

于 2012-06-20T03:19:22.670 回答