错误检查不是int的内容时,控制台被淹没

时间:2020-05-10 13:11:36

标签: c++ integer error-checking

我试图只允许整数值进入程序,所以我做了以下函数。该功能与我在网上看到的其他功能相似,并且在我添加!之前,我的功能似乎还可以正常工作。在它前面检查是否某些东西不是int。

检查输入是否为整数的函数:

bool isInteger(std::string s)
{
    for (int i = 0; i < s.length(); i++)
    {
        if (isdigit(s[i]) == false)
        {
            return false;
        }

        return true;
    }
}

正在使用的功能:

int getLevel()
{
    int level;

    std::cout << "Level One\n";
    std::cout << "Level Two\n";
    std::cout << "Level Three\n";
    std::cout << "Level Four\n";
    std::cout << "Level Five\n";
    std::cout << "Enter your level (1-5): ";
    std::cin >> level;

    while (!isInteger(std::to_string(level)) || level < 1 || level > 5)
    {
        std::cout << "Enter an integer value between 1-5 inclusive: ";
        std::cin >> level;
    }

    clrscr();
    return level;;
}

我相信该功能在输入!之前都可以正常工作。在它前面。我试图仅允许将整数输入到程序中,并且当我输入双精度或字符串时,控制台将显示以下消息:“输入1-5之间的整数值:”,并且没有任何时间输入输入。我对C ++编程相当陌生,可以使用一些建议。谢谢!

3 个答案:

答案 0 :(得分:1)

Element = items, Depth = 0
Element = item, Depth = 1
Element = name, Depth = 2
Element = ppu, Depth = 2
Element = batters, Depth = 2
Element = batter, Depth = 3
Element = batter, Depth = 3
Element = batter, Depth = 3
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2
Element = topping, Depth = 2

将尝试读取一个整数,并且它将永远不会读取除整数以外的任何内容。如果失败,则设置std::cin >> level; 的{​​{1}},并跳过其他输入操作(如循环内的std::cin)。

您需要检查读取是否成功,否则请忽略当前输入。例如:

failbit

一些半相关的提示:std::cin >> level;始终为整数。将其转换为字符串始终始终是整数的字符串表示形式,因此std::cout << "Enter your level (1-5): "; while(!(std::cin >> level) || level < 1 || level > 5) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Enter an integer value between 1-5 inclusive: "; } 始终始终为level,除非{{1} }为负数,因为您不检查符号。

另外,isInteger(std::to_string(level))中的true必须在循环之外,否则您只检查第一个字符。

答案 1 :(得分:1)

感谢所有答复和澄清,我设法提出了自己的解决方案。

新的isInteger函数现在可以检查所需的所有内容,包括上面用户建议的输入“ 0004”:

bool errorCheck(std::string s)
{
    int intLevel;
    std::stringstream tempLvl(s);
    tempLvl >> intLevel;

    for (int i = 0; i < s.length(); i++)
    {
        if (isdigit(s[i]) == false || s[0] == '0' || intLevel < 1 || intLevel > 5)
        {
            return false;
        }
    }
    return true;
}

正在使用的方法:

    std::cout << "Enter your level (1-5): ";
    std::cin >> stringLevel;

    while (!errorCheck(stringLevel))
    {
        std::cout << "Enter an integer value between 1-5 inclusive: ";
        std::cin >> stringLevel;
    }

    std::stringstream lvl(stringLevel);
    lvl >> level;

    clrscr();
    return level;
}

如果您发现代码中有任何问题或有更简单的解决方案,请告诉我。感谢您的所有帮助!

答案 2 :(得分:0)

好吧,我要告诉你一个事实,就是控制台输入会从控制台中提取输入,所以如果你曾经尝试做类似的事情 也就是说,读取字符串代替整数cin会处于错误状态,您可以通过像这样放置if来检查这一事实

if(!cin>>level) break;

,您将发现它实际上在工作,流从控制台接收了输入并将其转换为boolean值,因此您始终可以检查其状态为错误状态,返回false否则为true ... .....

因此,最终该错误位于cin>>level中... 希望您理解...。也请查看该return true语句。

我将为您提供有关此错误的更多答案的参考链接... user enters String instead of Int

相关问题