我正在写一些代码,但遇到了一些麻烦。我想编写一个函数来检查一个字符串是否有任何元音,并尝试通过一个带有switch语句的for循环来完成它。显然,它不起作用,并且由于某种原因永远不会返回。
bool scanStr(string userInp) {
for (int i = 0; i < userInp.size(); i++) {
switch (userInp[i])
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
case 'y':
case 'Y':
return true;
break;
default:
return false;
}
}
}
我试过测试程序是否实际上正在迭代字符串,而且它是,所以我不明白为什么在函数中,它总是返回false?
int main() {
string userInp;
string pigLatin;
cout << "Please enter a string to convert to pig Latin: " << endl;
cin >> userInp;
cout << endl;
// tests
for (int i = 0; i < userInp.size(); i++) { //checking if it actually iterates
cout << userInp[i];
}
cout << endl;
if (scanStr(userInp))
cout << "it has a vowel" << endl;
else
cout << "no vowel" << endl;
system("pause");
return 0;
}
起初我认为这是因为即使在最后一个案例之后有一个中断声明,循环仍然继续,但我不完全确定这是否是原因。
有什么想法吗?
答案 0 :(得分:13)
我建议您将元音测试的逻辑提取到自己的函数中:
WordMLPackage.getMainDocumentPart().addStyledParagraphOfText("Subtitle","Arial");
然后您可以使用标准算法而不是循环:
bool is_vowel(char x)
{
switch (x)
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
case 'y':
case 'Y':
return true;
default:
return false;
}
}
(我将#include <algorithm>
#include <string>
bool contains_vowel(const std::string& str)
{
return std::any_of(str.begin(), str.end(), is_vowel);
}
重命名为scanStr
,因为该名称更具描述性。)
答案 1 :(得分:5)
从你的函数中删除这一行:
default:
return false;
他们让你的函数在它遇到的第一个非元音上返回false
。
如果您到达循环的 end 并且尚未返回false
,您只想返回true
。
bool scanStr(string userInp)
{
for (int i = 0; i < userInp.size(); i++)
{
switch (userInp[i])
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
case 'y':
case 'Y':
return true;
}
}
return false;
}
现代C ++中更好的方法是:
bool scanStr(const std::string& userInp)
{
for (const auto c : userInp)
{
switch (c)
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
case 'y':
case 'Y':
return true;
}
}
return false;
}
但是如果你不知道这意味着什么,现在不要担心,你的书或教程很快就会解释。
答案 2 :(得分:1)
问题是,如果任何字符不是元音,那么该函数会立即返回false。也可以使用const &
。 const
允许你传递const字符串并引用节省一些时间,因为C ++不必复制整个字符串。
bool scanStr(const string & userInp) {
for (int i = 0; i < userInp.size(); i++) {
switch (userInp[i])
{
case 'a':
case 'A':
case 'e':
case 'E':
case 'i':
case 'I':
case 'o':
case 'O':
case 'u':
case 'U':
case 'y':
case 'Y':
return true;
break;
}
}
return false;
}
答案 3 :(得分:0)
首先,编译器会将switch case转换为查找表,然后auto
将由编译器根据分配的值确定为数据类型(在本例中为char
{{1} }})。
或者只是将它交给你的编译器,它知道怎么做。
bool scanStr(string userInp)
{
for(auto c : userInp)
{
switch (c)
{
case 'a': case 'A':
case 'e': case 'E':
case 'i': case 'I':
case 'o': case 'O':
case 'u': case 'U':
case 'y': case 'Y':
return true;
}
}
return false;
}