为啥代码打印所有第一个索引?
Posted
技术标签:
【中文标题】为啥代码打印所有第一个索引?【英文标题】:why code is printing all the first index?为什么代码打印所有第一个索引? 【发布时间】:2013-01-27 15:18:43 【问题描述】:我正在尝试编写一个程序,将文本文件中的单词转换为猪拉丁语。我得到了将文本文件的单词分开的代码,但我现在在尝试整理它们时遇到了麻烦。当我运行此代码时,它总是打印所有单词的第一个索引,而不是与 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;
【问题讨论】:
【参考方案1】: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)
哪个是最短的!
阅读文档以了解他们每个人的真正作用,以及为什么它适用于您的案例:
std::any_of
std::find
std::count
std::string::find
希望对您有所帮助。
【讨论】:
有更短的方法吗? 或v.find(word[0])!=std::string::npos
,如果你使用字符串的整体设计。【参考方案2】:
以上使用大量word[0] == 'a' || word[0] == 'e' || ...
的建议是“修复”您所写内容的正确解决方案,它会按照您对单个 if 语句的期望进行。
你可以这样做:
switch(word[0])
case 'a':
case 'e':
case 'i':
... /// you'll have to fill the rest in yourself.
cout << word[0];
break;
或者你可以使用老式的 C 风格 strchr
:
if (strchr("aeiouAEIOU", word[0]) != NULL)
cout << word[0];
可能还有六种其他解决方案。这一切都取决于你喜欢什么“风格”。我可能会选择交换机作为我的第一选择。
【讨论】:
以上是关于为啥代码打印所有第一个索引?的主要内容,如果未能解决你的问题,请参考以下文章
将第一个节点添加到hashmap中的链表时,为啥必须将新节点直接分配给索引指针?
查找列表的“最佳”项并在python中打印第一个实例的索引位置[重复]