Проверка ввода для принятия только значений Int - PullRequest
0 голосов
/ 26 января 2020

Я разрабатываю программу для чтения нескольких пользовательских вводов, и в спецификациях указано, что они всегда являются положительными целыми числами. Затем эти значения будут изменены, чтобы сохранить только значение сотен, и использоваться для отображения гистограммы. У меня проблема с проверкой ввода программы. Если пользователь игнорирует инструкции и вводит десятичное значение вместо целого, сразу же отображается остальная часть выходных данных программы без возможности для пользователя вводить какие-либо дополнительные значения. Моя попытка поймать эту проблему показана ниже в операторах 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.

Подводя итог, мне нужно проверить ввод пользователя, чтобы через любой метод ввода принималось только положительное целое число. Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 26 января 2020

Вы можете использовать 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;
}
...