哪个字符是 c++ 中 4 个字符中的第一个
Which character is first among 4 characters in c++
在我的项目中,我从用户那里获取一个字符串,然后我需要检查元音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 答案所需的任何其他内容,但这是一种方法,并且确实允许提取更多信息。但是,当前代码只会为您提供每个代码的第一次出现。我不确定你是想要全部还是第一个,但它是适应性强的。不过,在这一点上,大卫的回答非常吻合。
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- C++:使用另一个字符将一个字符大写
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 将字符从一个字符串简单分配到另一个字符串不起作用
- 为什么第一个Dynamic_cast没有投射到基类?
- 将第一个n个字符复制到std :: string
- 一个奇怪的字符出现在我的字符数组的第一个
- 当一长串字符传递给第一个 cin 时,为什么不暂停第二个 cin 上的输入?
- 哪个字符是 c++ 中 4 个字符中的第一个
- 从 std::string 中提取(第一个)UTF-8 字符