所以我看到很多人都在问这个问题而且网上没有很多可靠的答案。大多数只是检查是否放置了一个整数代替字符串,但是如果输入了一个浮点数,那么它会截断下半部分,或者如果整数和字符是intered,它会截断字符。我需要帮助编写一段代码来检查用户输入,并要求用户在输入无效或有效/无效的组合时重试。我认为基本的想法是创建一个字符串,所以它接受任何东西,然后使用sstream操纵,然后回到int,如果输入是合法的,但我不能真正设法检查其他部分。如果任何人遇到这个或者可以帮助我,请链接我。当我很好地了解该怎么做时,我会发布我的代码。
答案 0 :(得分:2)
假设您无法使用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. Goodbye\n";
exit(1);
}
}
答案 1 :(得分:2)
您可以像使用stol
一样使用C ++ 11 string conversion functionstry
{
std::string value = ...;
long number = std::stol(value);
}
catch (std::invalid_argument const& e)
{
// no conversion could be performed
}
评论后更新:Visual Studio 2012附带的Visual C ++ 11实现了std::stol
作为strtol
中声明的<cstdlib>
的方便包装。我认为可以安全地假设大多数C ++ 11实现以最佳方式定义它,而不是达到std::stringstream
机制。
答案 2 :(得分:1)
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...";
答案 3 :(得分:0)
我不知道标准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());
}