如何使cin只采取数字

use*_*900 10 c++

这是代码

double enter_number()
{
  double number;
  while(1)
  {

        cin>>number;
        if(cin.fail())
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Invalid input " << endl;
        }
        else
        break;
        cout<<"Try again"<<endl;
  }
  return number;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我输入类似1x的内容时,则将1作为输入,而不会注意到为另一次运行留下的字符.有没有办法让它适用于任何实数,例如1.8?

Shi*_*ven 20

当cin遇到输入时,它无法正确读入指定的变量(例如将字符输入整数变量),它进入错误状态并将输入留在其缓冲区中.

您必须执行几项操作才能正确处理此方案.

  1. 您必须测试此错误状态.
  2. 您必须清除错误状态.
  3. 您必须交替处理生成错误状态的输入数据,或者将其刷新并重新提示用户.

以下代码提供了执行这三项操作的众多方法之一.

#include<iostream>
#include<limits>
using namespace std;
int main()
{

    cout << "Enter an int: ";
    int x = 0;
    while(!(cin >> x)){
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid input.  Try again: ";
    }
    cout << "You enterd: " << x << endl;        
}
Run Code Online (Sandbox Code Playgroud)

您可以将一些大的值传递给cin.ignore,如1000,并且它可能在所有实际用途中表现完全相同.

您也可以在输入尝试后测试cin并以这种方式处理它,例如if(!cin){//清理错误}.

查看用于处理流状态的其他成员函数的istream引用:http://cplusplus.com/reference/iostream/istream/


Jes*_*ood 9

我会使用std::getlinestd::string读取整行,然后只有在你可以将整行转换为double时才会跳出循环.

#include <string>
#include <sstream>

int main()
{
    std::string line;
    double d;
    while (std::getline(std::cin, line))
    {
        std::stringstream ss(line);
        if (ss >> d)
        {
            if (ss.eof())
            {   // Success
                break;
            }
        }
        std::cout << "Error!" << std::endl;
    }
    std::cout << "Finally: " << d << std::endl;
}
Run Code Online (Sandbox Code Playgroud)