7

假设我有一个接受整数的程序。如果用户输入超出范围的数字或字母或其他内容,如何阻止程序崩溃?

4

5 回答 5

4

cin基类是std::basic_istream. 输入流指示一个可恢复的错误,以防它无法从流中提取请求的数据。为了检查那个错误位,std::basic_istream::fail()必须使用方法——true如果出现故障或false一切正常,它就会返回。重要的是要记住,如果出现错误,数据将留在流中,当然,还必须使用 清除错误位std::basic_istream::clear()。此外,程序员必须忽略不正确的数据,否则尝试读取其他内容将再次失败。为此,std::basic_istream::ignore()可以使用方法。至于取值的有效范围,必须手动检查。好了,理论说得够多了,下面是一个简单的例子:

#include <limits>
#include <iostream>

int main()
{
    int n = 0;

    for (;;) {
        std::cout << "Please enter a number from 1 to 10: " << std::flush;
        std::cin >> n;

        if (std::cin.fail()) {
            std::cerr << "Sorry, I cannot read that. Please try again." << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            continue;
        }

        if (n < 1 || n > 10) {
            std::cerr << "Sorry, the number is out of range." << std::endl;
            continue;
        }

        std::cout << "You have entered " << n << ". Thank you!" << std::endl;
        break;
    }
}

希望能帮助到你。祝你好运!

于 2012-11-08T03:05:26.530 回答
4

我更喜欢将输入读取为字符串,然后使用boost::lexical_cast<>

#include <boost/lexical_cast.hpp>
#include <iostream>
#include <string>

int main () {
  std::string s;
  while( std::cin >> s) {
    try {
      int i = boost::lexical_cast<int>(s);
      std::cout << "You entered: " << i << "\n";
    } catch(const std::bad_cast&) {
      std::cout << "Ignoring non-number: " << s << "\n";
    }
  }
}

后记:如果你对 Boost 过敏,可以使用 lexical_cast 的这个实现:

template <class T, class U>
T lexical_cast(const U& u) {
  T t;
  std::stringstream s;
  s << u;
  s >> t;
  if( !s )
    throw std::bad_cast();
  if( s.get() != std::stringstream::traits_type::eof() )
    throw std::bad_cast();
  return t;
}
于 2012-11-08T03:22:27.777 回答
1

如果我没记错的话,你应该在检查后清除缓冲区

 if (cin.fail())
    {
      cout<<"need to put a number"<<endl;
      cin.clear();
      cin.ignore();
     }  
于 2012-11-08T02:59:56.207 回答
1

如果您不想在代码中添加库,也可以使用 do..while() 语句。在您的 do while 中,您将要求用户输入,然后将其接收到您的变量中,然后在 while 部分中,您将能够检查这是否是您期望的数据,如果不继续要求数据的话。

只是另一种选择....即使已经提到的答案应该足够有效

于 2012-11-08T03:22:19.977 回答
1

您可以使用以下代码来最简单快速地检查 int 中的有效输入:

#include "stdafx.h"

#include <iostream>
using namespace std;

int main()
{

    int intb;
    while( !( cin>>intb ) ){
        cin.clear ();
        cin.ignore (1000, '\n');
        cout<<"Invalid input enter again: "<<endl;

    }
    cout<<"The value of integer entered is "<<b<<endl;

        return 0;
}

while 循环不断迭代,直到获得正确的输入。cin.clear() 改变错误控制状态。cin.ignore() 清除输入流,以便可以再次获取新输入。如果未完成,while 循环将处于无限状态。

于 2012-11-08T06:28:33.057 回答