哪个字符是 c++ 中 4 个字符中的第一个

Which character is first among 4 characters in c++

本文关键字:字符 第一个 c++      更新时间:2023-10-16

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

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;
}

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

如果您不需要原始字符串中的位置,而只需要顺序,则可以将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将仅包含原始字符串中存在的元音,并按它们出现的确切顺序。算法不会修改大小写。

或者,您可以手动迭代字符串中的元素,并测试每个字符以查看它是否是元音,然后打印它或执行任何需要完成的操作。如果这是家庭作业,这可能是对你的期望。

这可以通过简单地迭代输入表达式并注意何时遇到目标字母来轻松完成。 这是一种C++11方法,它将按照元音在输入表达式中的显示顺序填充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);
   }
});

这是一个方法,可以为您提供找到的字符以及索引(自动排序)。它还利用了一些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';
    }
}

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