我正在努力确保用户输入是一个正整数,无论用户试图放入什么,我的功能都能正常工作。
int getNumber()
{
string userInput;
int userNumber;
bool badInput = true;
cout<<"Enter a positive integer: ";
cin>>userInput;
while (badInput)
{
for (int i=0; i<userInput.length(); i++)
{
if (isdigit(userInput[i]))
{
badInput = false;
}
else
{
badInput = true;
cout<<"That wasn't a valid input, try again: ";
cin>>userInput;
break;
}
}
}
userNumber = atoi(userInput.c_str());
return userNumber;
}
有更清洁的方法吗?这是最好的方法吗?我尝试了各种其他方法,比如使用cin.bad等,但他们总是设法错过一些问题。
答案 0 :(得分:1)
如果需要检查正整数,可能需要 将文本转换为整数。你应该两个都做 立刻;类似的东西:
std::string line;
if ( !std::getline( std::cin, line ) ) {
// no input available...
} else {
std::istringstream parser( line );
int userNumber;
if ( parser >> userNumber >> std::ws
&& parser.get() == EOF
&& userNumber > 0 ) {
// All OK...
} else {
// Some error in the input.
}
}
如果你有字符串,也可以使用strtol
别处。错误检测有点棘手,因为strtol
在某些情况下有一些奇怪的语义:
int
getPositiveInteger( std::string const& input )
{
char const* end;
errno = 0;
long results = strtol( input.c_str(), &end, 10 );
if ( end != input.c_str() ) {
while ( isspace( static_cast<unsigned char>( *end) ) ) {
++ end;
}
}
return (errno == 0
&& end != input.c_str()
&& *end == '\0'
&& results > 0
&& results <= INT_MAX)
? results
: -1;
}
(如果发生错误,我已经返回-1。)
您会注意到您必须测试的条件数量
确保stdtol
工作正常。
答案 1 :(得分:0)
你可以简单地使用strtol
,如下所示:
char str[] = "+12345";
char* end;
long number = strtol(str, &end, 10);
if (number < 0) {
printf("Number is negative!\n");
// ...
}
if (*end) {
printf("Junk found after number: '%s'\n", end);
// ...
}
答案 2 :(得分:0)
您可以使用std::string::find_first_not_of()
对数字进行测试,使用std::stoi
进行溢出
std::string input;
bool badInput;
int i;
std::cout << "Enter a positive integer: ";
do {
std::cin >> input;
try {
badInput = input.find_first_not_of("0123456789") != std::string::npos;
if (!badInput)
i = std::stoi(input);
} catch (const std::invalid_argument&) {
badInput = true;
} catch (const std::out_of_range&) {
badInput = true;
}
if (badInput)
std::cout << "That wasn't a valid input, try again: ";
} while (badInput);
但这并不会检查前导+
。
答案 3 :(得分:0)
就像mvp所说,strol
是要走的路。
bool string_to_int(char* s, int* val) {
char* endptr;
errno = 0; /* reset errno */
int i = strtol(s, &endptr, 10);
if (endptr == s) return false; /* conversion failed */
if (*endptr) return false; /* unexpected characters behind the integer */
if (errno) return false; /* out of range */
*val = i;
return true;
}