我正在设计一个程序来读取多个用户输入,并且规范包括它们始终为正整数。然后将这些值修改为仅保留数百个值,并用于显示条形图。我遇到的问题是程序的输入验证。如果用户不理会指令而输入十进制值而不是整数,则程序输出的其余部分将立即显示而用户无法输入任何其他值。下面的if语句显示了我解决此问题的尝试。
int main() {
int store1;
int store2;
cout << "Enter today's sales for store 1:" << endl;
cin >> store1;
if(store1 < 0 || ((store1 % 1))!=0)
cout << "Value of sales must be an integer greater than zero" << endl;
cout << "Enter today's sales for store 2:" << endl;
cin >> store2;
if(store2 < 0 || ((store2 % 1))!=0)
cout << "Value of sales must be zero or greater" << endl;
如果用户输入小数,则程序输出为:
Enter today's sales for store 1:
400.34
Enter today's sales for store 2:
Enter today's sales for store 3:
Value of sales must be zero or greater
Enter today's sales for store 4:
Enter today's sales for store 5:
SALES BAR CHART
(Each * = $100)
Store 1: ****
Store 2:
Store 3:
Store 4:
Store 5:
Process finished with exit code 0
[如果我不得不猜测,则将小数点后的值(在这种情况下为3和4)分别传递给存储2和3的输入,并且由于它们小于100,因此在相应存储旁边没有显示* 。出于可读性考虑,我没有包括获取数百个值和输出*的代码,而且由于我几乎是肯定的,所以我的问题与cin有关。
总而言之,我需要验证用户输入,以便通过任何输入方法只能接受一个正整数。任何帮助是极大的赞赏!
您可以使用strtoll转换和验证编码整数的输入字符串。
从cin
读取的值是string
类型,然后将其传递到get_positive_integer()
,该包装器是strtoll
的包装,转换并验证字符串,当字符串不符合预期时,它返回-1。格式,否则返回解码后的正整数。请注意,使用中间的long long
类型可以轻松检查溢出,并使用getline读取整个输入行而不会在空格处打断字符串,该字符串会将第一行的输入传递到下一个读数。
#include <climits>
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int get_positive_integer(const string& str)
{
const char* s = str.c_str();
char* end;
long long val = strtoll(s, &end, 10);
if (end == s) {
// str was not encoding an integer.
return -1;
}
if (*end) {
// Stopped reading before the end of the string
// the whole string was not an integer.
return -1;
}
if (val > INT_MAX) {
// Too big to fit in an int type
return -1;
}
if (val <= 0) {
// Not a positive integer.
return -1;
}
return val;
}
int main()
{
string input;
cout << "Enter a positive integer:" << endl;
getline(cin, input);
int value = get_positive_integer(input);
if (value < 0) {
cout << "Not a valid positive integer" << endl;
return EXIT_FAILURE;
}
cout << "Value: " << value << endl;
return EXIT_SUCCESS;
}