检查c++中合法的整数输入

Checking for legitimate integer input in c++

本文关键字:整数 输入 c++ 检查      更新时间:2023-10-16

所以我看到很多人问这个问题,但没有很多可靠的答案漂浮在网上。大多数只是检查是否将整数放置在字符串的位置,但如果输入的是浮点数,则会截断下半部分,或者如果将整数和字符放在一起,则会截断字符。我需要帮助编写一段代码,检查用户输入,并要求用户重试,如果他的输入无效或有效/无效的组合。我认为基本的想法是创建一个字符串,所以它接受任何东西,然后使用sstream操作,然后返回int,如果输入是合法的,但我真的无法检查其他部分。如果有人遇到这个或可以帮助我,请链接我。当我对该做什么有很好的感觉时,我会发布我的代码。

假设您不能使用boost::lexical_cast,您可以编写自己的版本:

#include <sstream>
#include <iostream>
#include <stdexcept>
#include <cstdlib>
template <class T1, class T2>
T1 lexical_cast(const T2& t2)
{
  std::stringstream s;
  s << t2;
  T1 t1;
  if(s >> std::noskipws >> t1 && s.eof()) {
    // it worked, return result
    return t1;
  } else {
    // It failed, do something else:
    // maybe throw an exception:
    throw std::runtime_error("bad conversion");
    // maybe return zero:
    return T1();
    // maybe do something drastic:
    exit(1);
  }
}

int main() {
  std::string smin, smax;
  int imin, imax;
  while(std::cout << "Enter min and max: " && std::cin >> smin >> smax) {
    try {
      imin = lexical_cast<int>(smin);
      imax = lexical_cast<int>(smax);
      break;
    } catch(std::runtime_error&) {
      std::cout << "Try again: ";
      continue;
    }
  }
  if(std::cin) {
    std::cout << "Thanks!n";
  } else {
    std::cout << "Sorry. Goodbyen";
    exit(1);
  }
}

您可以使用c++ 11的字符串转换函数,如stol

try
{
    std::string value = ...;
    long number = std::stol(value); 
}
catch (std::invalid_argument const& e)
{
    // no conversion could be performed
}

Post-comments更新:Visual Studio 2012附带的Visual c++ 11实现了std::stol,作为<cstdlib>声明的strtol的方便包装。我认为可以安全地假设大多数c++ 11实现都以最优的方式定义它,而不是达到std::stringstream机制。

C函数strtol(以及它的兄弟函数)将能够告诉您输入给它的字符串是否已被完全使用。

 std::string str;
 char *endptr;
 std::cin >> str;
 long x = std::strtol(str.c_str(), &endptr, 0); 
 if (*endptr != 0) 
    cout << "That's not a valid number...";

我不知道标准c++库中是否有像java中那样封装原始类型的类但这里有一个简单而非常基本的实现是怎样的

class Integer {
   private:
       int value;
       void parse(string);
   public:
       Integer(string);
       int intValue();
};
Integer::Integer(string sint) { parse(sint); }
int Integer::intValue() { return value; }
void Integer::parse(string sint) {
    string::iterator its = sint.begin();
    while(its != sint.end() && (! (*its < '0' || *its > '9'))) {
        its++;
    }
    if(its != sint.end()) {
        throw sint + ": Input is not a valid integer.";
    }
    value = atoi(sint.c_str());
}