【问题标题】:How to check if the input number integer not float?如何检查输入数字整数是否不浮动?
【发布时间】:2021-03-13 03:40:02
【问题描述】:

我想检查输入是否有效,但是当我运行此代码时,我发现它只检查输入的字符。如果我输入一个浮点数,它将使用它并像整数一样使用没有小数部分。

#inclide <iostream>
using namespace std;
...
int n;
cout << "Your input is: "<<endl;
cin >> n;
while (cin.fail()) {
    cout << "Error. Number of elements must be integer. Try again: " << endl;
    cin.clear();
    cin.ignore(256, '\n');  
    cin >> n;
}
...        
      `

那么,如何让这段代码查看输入是否为浮点数?

【问题讨论】:

  • 作为字符串读入并解析。
  • 你问错了问题,这个问题有一个后续问题:“我如何观察任何非数字输入?” 你应该问的问题问题是这样的:*“我如何确定整个输入是否是整数的一部分,this answer 完美地解决了这个问题。

标签: c++ visual-studio


【解决方案1】:

您可以尝试使用std::istringstream 将输入字符串转换为int。如果成功,则检查eof()(在忽略空格之后)以查看在转换为int 时是否消耗了整个输入。如果整个输入都被消耗了,那么它就是一个有效的int

有点像这样:

int input_int()
{
    int i;

   // get the input
    for(std::string line; std::getline(std::cin, line);)
    {
        // try to convert the input to an int
        // if at eof() all of the input was converted - must be an int
        if(!line.empty() && (std::istringstream(line) >> i >> std::ws).eof())
            break;

        // try again
        std::cout << "Not an integer please try again: " << std::flush;
    }

    return i;
}

int main()
{
    std::cout << "Enter an integer: " << std::flush;

    std::cout << "i: " << input_int() << '\n';
}

【讨论】:

    【解决方案2】:

    Raindrop7 的解决方案为基础,以下是完成您需要的完整代码:

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main()
    {
        double m;
        cout << "Your input is: "<<endl;
        cin >> m;
        while (cin.fail() || (m-floor(m)))
        {
            cout << "Error. Nubmer of elements has to be integer. Try again: " << endl;
            cin.clear();
            cin.ignore(256, '\n');  
            cin >> m;
        }
        int n = (int)m;
        return 0;
    }
    

    这是一个示例输出:

    Your input is: 
    2.7
    Error. Nubmer of elements has to be integer. Try again: 
    erer
    Error. Nubmer of elements has to be integer. Try again: 
    2
    

    【讨论】:

    • 这纯属巧合,会产生误报。浮点表示不精确,operator&gt;&gt; 丢失信息。如果事情变糟,它将浮点值转换为可以用整数值表示的东西。你的测试就完成了……
    • @IInspectable 举个例子来证明你所说的
    • @Raindrop7:看看std::nextafter, std::nexttoward,并生成任意示例来证明这一事实。 (提示:从任何整数开始,向更高的值调用std::next,然后输入刚好低于这两个值中点的值。)
    • 谢谢!是的,这很好。但我们为了实践我们创造我们自己的尝试。在实际程序中,我们使用这些新设施
    【解决方案3】:

    下面的代码应该可以实现你希望达到的效果:

    #inclide <iostream>
    using namespace std;
    int n;
    cout << "Your input is: "<<endl;
    while (!(cin >> n) || cin.get() != '\n') {
        cout << "Error. Number of elements must be integer. Try again: " << endl;
        cin.clear();
        cin.ignore(256, '\n');  
    }
    

    如果发生以下任一情况,程序会要求用户重新输入一个整数:

    1. 如果程序无法从std::cin 流中提取整数。 (例如,当用户输入一个字符或字符串时)
    2. 如果整数提取成功后,std::cin 中的下一个字符不是新行'\n' 字符。 (例如,当输入像1.1 这样的带小数点的数字时,或者当输入一个整数后跟像1a 这样的字符时。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多