如何检查输入数字整数是不是不浮动?

Posted

技术标签:

【中文标题】如何检查输入数字整数是不是不浮动?【英文标题】:How to check if the input number integer not float?如何检查输入数字整数是否不浮动? 【发布时间】:2016-10-18 22:52:37 【问题描述】:

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

#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 完美地解决了这个问题。 【参考方案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');  

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

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

【讨论】:

以上是关于如何检查输入数字整数是不是不浮动?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是为数字? [复制]

如何检查字符串输入是不是为数字?

如何检查输入数字是不是在多个数字Jquery之间?

检查输入字符串是不是包含javascript中的数字

C#中如何检查文本框的输入信息是不是为数字?

如何检查数字输入是不是为空?