一种不接受float作为输入c ++的方法

时间:2015-11-29 18:51:03

标签: c++ input floating-point int

我正在开发一个需要检查输入正确的项目(n),我目前有一些代码不允许输入字符串,因为它会再次询问正确的数量。我在编写一个不允许浮点数通过的代码时遇到了麻烦,因为它当前只是忽略了输入的float部分。如果这是一个简单的问题,我很抱歉,但我还没有办法解决这个问题。

  for(int i=0; i<1; ++i)
    {
        string b1;
        int e;
        do
        {
            getline(cin,b1);
            e=atoi(b1.c_str());
        }
        while(e==0 && b1!="0");
        n=e; // where n is the user input
    }

4 个答案:

答案 0 :(得分:1)

假设您考虑使用小数点('.')或使用带有负指数的科学记数法作为不可接受的浮点数,只需检查输入的字符串是否包含其中一个:

std::string::iterator it;
if (b1.end() != std::find(b1.begin(), b1.end(), '.')
    || (b1.end() != (it = std::find_if(b1.begin(), b1.end(),
                                       [](char c){ return c == 'e' || c == 'E'; })
        && it + 1 != b1.end()
        && '-' == it[1])) {
    // deal with the string being a floating point number with a fractional part
}

请注意,这会将"10e-1"视为错误值,尽管它实际上只是"1"的奇特拼写。

答案 1 :(得分:0)

如果您输入float值,则会有decimal point (.)。由于您的输入是string,因此您可以执行以下检查: -

do
{
     getline(cin,b1);
     if(bi.find(".")!=b1.npos); // search if a decimal point is present or not
     cout<<"wrong input";
     else
     e = stoi(b1);  // stoi works similar to atoi but on strings
}

答案 2 :(得分:0)

您可以将MessageEventArgs me = new MessageEventArgs(); me.weekNo = k; me.DayNo = i; OnMessageSending(me); 用于此目的: -

std::stringstream

答案 3 :(得分:0)

你要做的第一件事就是不要一遍又一遍地重复代码来读取整数。做一个功能:

int getInt(std::istream & in)

这将采用任何输入流cin,文件,std::stringstream等等。接下来,我们设置了一些我们需要的局部变量。

{
    std::string b1;
    int e;

现在我们构建输入循环

    while (std::getline(in, b1))

这将循环直到输入流失败。如果它永远不会失败并且用户无法完成他们的行为,那么我们将在这里待很长时间。与吉利根。船长也是。也许我们可以从豪威尔先生那里掏出一些开办种子资金的钱,嗯?

    {
        size_t pos;

捕获字符串-to-int转换引发的任何异常

        try
        {

转换为int。将使用结束转换的字符更新pos。如果它不是字符串的结尾,则该字符串不包含int。如果它包含int,我们退出该函数并返回int

            e = std::stoi(b1, &pos);
            if (pos == b1.length())
            {
                return e;
            }
        }

我们真的不需要在catch区块做任何事情。如果您愿意,可以输出消息来指导或模仿用户。

        catch (...)
        {

        }
    }

如果我们到这里,IO流失败了,我们需要让人们知道。抛出异常。

    // IO failure. throw exception
}

用法很简单:

int value = getInt(cin);

您可能希望将调用包装在try-catch块中以捕获IO失败异常。 cin的失败案例非常奇怪,但通常是致命的。

在文件上调用getInt时,您需要更仔细地处理事情,因为文件末尾很常见。

所有人都没有正在进行的评论:

int getInt(std::istream & in)
{
    std::string b1;
    int e;
    while (std::getline(in, b1))
    {
        size_t pos;
        try
        {
            e = std::stoi(b1, &pos);
            if (pos == b1.length())
            {
                return e;
            }
        }
        catch (...)
        {

        }
    }
    // IO failure. throw exception
}