仅接受Int值的输入验证

问题描述 投票:0回答:1

我正在设计一个程序来读取多个用户输入,并且规范包括它们始终为正整数。然后将这些值修改为仅保留数百个值,并用于显示条形图。我遇到的问题是程序的输入验证。如果用户不理会指令而输入十进制值而不是整数,则程序输出的其余部分将立即显示而用户无法输入任何其他值。下面的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有关。

总而言之,我需要验证用户输入,以便通过任何输入方法只能接受一个正整数。任何帮助是极大的赞赏!

c++ validation input type-conversion output
1个回答
0
投票

您可以使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.