12

这是代码

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;
}

我的问题是,当我输入 1x 之类的内容时,会将 1 作为输入,而不会注意到为另一次运行而遗漏的字符。有什么方法可以使它与任何实数一起工作,例如 1.8?

4

3 回答 3

31

当 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;        
}

您可以将一些较大的值传递给 cin.ignore ,例如 1000 ,并且对于所有实际目的而言,它的行为可能完全相同。

您还可以在输入尝试后测试 cin 并以这种方式处理它,例如 if(!cin){//clean up the error} 。

查看其他成员函数的 istream 参考以处理流状态:http ://cplusplus.com/reference/iostream/istream/

于 2012-05-31T07:15:14.273 回答
14

我会使用std::getlineandstd::string来读取整行,然后只有当你可以将整行转换为双精度时才跳出循环。

#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;
}
于 2012-05-31T07:21:55.200 回答
-3
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int get_int(void);
int main()
{
    puts("Enter a number");
    cout<<"The integer is "<<get_int()<<endl;
    return 0;
}
int get_int(void)
{
    char str[20];
    char* end;
    int num;
    do{
        fgets(str,20,stdin);
        str[strlen(str)-1]='\0';
        num=strtol(str,&end,10);
        if(!(*end))
            return num;
        else
        {
            puts("Please enter a valid integer");
            num=0;
        }
    }while(num==0);
}

这适用于任何整数。它甚至可以检查您是否在整数后输入了空格或任何其他字符。唯一的问题是它没有使用std::cin. 但是,问题std::cin在于它忽略了整数之后的任何空格字符,并愉快地将整数作为输入。

于 2020-09-20T05:52:59.567 回答