gpt4 book ai didi

c++ - 为什么代码打印所有第一个索引?

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:01 25 4
gpt4 key购买 nike

我正在尝试编写一个程序,将文本文件中的单词转换为 Pig Latin。我得到了将文本文件的单词分开的代码,但我现在在尝试将它们整理出来时遇到了麻烦。当我运行这段代码时,它总是打印所有单词的第一个索引,而不是与 if 语句匹配的单词

void wordpro(string sent)
{
string word;

istringstream iss(sent, istringstream::in);
while (iss>> word)
if (word[0] == 'a'||'e'||'i'||'o'||'u'||'A'||'E'||'I'||'O'||'U')
{
cout<< word[0] <<endl;
}
}

最佳答案

if (word[0] == 'a'||'e'||'i'||'o'||'u'||'A'||'E'||'I'||'O'||'U')

这不是 || 在 C++ 中的工作方式。但这并不意味着以上会导致编译错误。不,从编译器的角度来看这是正确的;唯一的问题是它没有按照您想要它做的去做!相反,条件将始终为 true。这就是它打印代码中所有单词的第一个字符的原因。

要得到你想要的,你必须将 || 写成:

if (word[0] == 'a'|| word[0] == 'e'|| word[0] ==  'i' || ... so on)

也就是说,你必须分别比较每个字符。这肯定令人恼火。


C++11 来拯救你,所以你可以使用 std::any_of作为:

//C++11 only

std::string const v = "aeiouAEIOU";
if (std::any_of(v.begin(), v.end(), [](char c){ return word[0] == c;})

或者您可以使用 std::find作为:

//C++03 and C++11 both

if ( std::find(v.begin(), v.end(), word[0]) != v.end() )

比上一个短了一点。此外,这也适用于 C++03!


或者您可以使用 std::count作为:

//C++03 and C++11 both

if ( std::count(v.begin(), v.end(), word[0]) )

甚至更短。


或者您可以使用 std::string::find作为:

//C++03 and C++11 both

if ( v.find(word[0]) != std::string::npos)

哪个最短!


阅读文档以了解他们每个人的真正作用,以及为什么它适用于您的情况:

希望对您有所帮助。

关于c++ - 为什么代码打印所有第一个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14548814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com