迭代字符串,并切换语句:C ++

时间:2016-04-18 06:17:02

标签: c++

我正在写一些代码,但遇到了一些麻烦。我想编写一个函数来检查一个字符串是否有任何元音,并尝试通过一个带有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;
}

起初我认为这是因为即使在最后一个案例之后有一个中断声明,循环仍然继续,但我不完全确定这是否是原因。

有什么想法吗?

4 个答案:

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