【问题标题】:How can I throw a error if the user enters more than one integer如果用户输入多个整数,如何抛出错误
【发布时间】:2020-12-24 00:27:51
【问题描述】:

这是我的代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

long int iterFunc(int);
long int recurFunc(int);


int main() {
  int n;

   while(true){
      try{
         cout << "Enter: ";
         if (!(cin >> n))
            throw("Type Error");
         if (n < 0)
            throw n;
         else 
            if (n == 0)
             break;
            cout << "Iterative: " << iterFunc(n) << endl;
            cout << "Recursive: " << recurFunc(n) << endl;
      }
      catch(int n){
         cout << "Error. Enter positive number." << endl;
      }
      catch(...){
         cin.clear();
         cin.ignore(100, '\n');
         cout << "Error. Please enter a number" << endl;
      }
   }
   cout << "Goodbye!";
   return 0;
}

long int iterFunc(int n){
  vector<long int> yVec = {1, 1, 1, 3, 5};
  if (n <= 5)
    return yVec[n - 1];
  else
    for(int i = 5;i < n; i++){
      long int result = yVec[i - 1] + 3 * yVec[i- 5];
      yVec.push_back(result);
    }
    return yVec.back();
}

long int recurFunc(int n){
  switch (n) { 
    case 1:  
    case 2:  
    case 3:  
      return 1; 
      break;
    case 4:
      return 3;
      break;
    case 5:
      return 5; 
      break;
    default:  
      return recurFunc(n - 1) + 3 * recurFunc(n - 5); 
      break;   
  } 
}`

程序应该只接受一个整数并使用迭代和递归实现返回函数的 y。例如:30、59、433。如果用户输入的整数多于一个,用空格分隔,如何抛出错误消息?例如:“3 45 32”。 我尝试使用if (cin.getline == ' ') throw("Error name"),但程序仍然执行并返回输入中数字的函数的y

【问题讨论】:

  • 通过std::stringstd::getline 将输入读取为一行,通过std::istringstream 解析该行,如果您检测到多个输入参数,请忽略整个事情,吠错误,然后继续。坦率地说,您不想支持多个输入参数的用例有点弱,但也没有很好地描述,所以这可能就是原因。
  • 这并没有解决问题,但是这段代码不适合使用异常。只需使用if ... else 进行错误处理。异常适用于无法在本地处理的错误。

标签: c++ validation input error-handling c++17


【解决方案1】:

这样的工作:

int main()
{
  std::string str;
  std::cout << "? : ";
  std::getline(std::cin, str);
  std::string::size_type pos(0);
  int i = std::stoi(str, &pos);
  if (pos != str.length())
    return 1;
}

【讨论】:

    【解决方案2】:

    我发现我的旧代码的一部分可能会派上用场。

    int val;
    do
    {
        cin>>val;
        if(!cin){ //you can add more conditions here
            cin.clear();
            cin.sync();
    
        /* additional error handling */
    
        }
        else{
            break; //input is correct - leaving loop
        }
    }while(true); //or here
    

    基本上!cin 所做的是 - 它检查您实际要写入的值类型,因为无论如何都需要确定数据类型是否写入我们的val 的正确类型。这意味着,“30”或“433”等是整数(正确),“s”或“字符串”等是字符串(或 char*,如果我错了,请纠正我)(不正确)。

    这也意味着,“3 45 32”应该被解释为字符串,这应该导致另一个循环运行。

    注意:我并没有真正测试过这段代码,所以它可能完全错误。

    编辑:好的,经过一些测试,我意识到这段代码需要重新调整。

    首先,“3 45 32”不被解释为字符串(现在可以理解了)。相反,第一个数字(在空格之前)保存为整数,所有其他数字都存储在缓冲区中(下一个 cin 将用它填充),我们可以避免再次使用 cin.clear()cin.sync()

    问题是 - 你可以接受第一个整数并忽略第一个空格之后的所有内容吗?如果没有,您将必须将输入保存为字符串并从中提取您想要的任何数据。

    为了方便在此编辑中查找参考,我将保留原始答案。

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2021-02-17
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多