Как сделать, чтобы моя программа проверяла не целочисленные значения и пробелы одновременно из пользовательского ввода - PullRequest
0 голосов
/ 05 апреля 2020

Я пытался использовать isdigit и isspace одновременно, но он не проверял бы и то и другое одновременно.

Если бы я набрал "123", "123" или "ab c "или" ab c ", это не вернет ошибку для проверки.

Я хочу убедиться, что пользователь вводит только целые числа.

И символы, кроме целые числа, такие как алфавиты, пробелы и знаки препинания, будут отклонены.

typedef struct
{
    int rack, level_no;
}LOCATION;

typedef struct
{
    int year_published, quantity;
    char isbn_code[15];
    char author[55];
    char title[105];
    char publisher[55];
    double price;
    LOCATION loc;
}DATA;

int add_record()
{
    DATA books[50];
    bool valid = true;

    system("CLS");
    cout << "\t\t\t\t\t\t\t\t\t     : :Add Book Record: :\n\n";

    ifstream infile("books.txt", ios::app);
    if (infile.is_open() && !infile.eof())
    {       

        do
        {
            cout << "ISBN Code: ";
            cin >> books->isbn_code[13];
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            if(!isdigit(books->isbn_code[13]) && isspace(books->isbn_code[13]))
            {
                cout << "Your input is invalid. Please enter again.\n";
                cout << "ISBN Code: ";
                cin >> books->isbn_code[13];
                valid = false;
            }
            else
                valid = true;
        } while (valid == true);
    }
return 0;
}

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Предполагая, что с остальным кодом все в порядке, кажется, что вы проверяете только элемент на 14-й позиции в вашем массиве isbn_code:

cin >> books->isbn_code[13];

Итак, если массив, который вы передаете, вход просто «123», 14-я позиция имеет случайное значение (т. е. предварительно выделено каким-то образом, которого вы не знаете).

0 голосов
/ 05 апреля 2020

Для этого не используйте std::cin >> (int/double), потому что он преобразует любой непробельный символ в число.

Используйте std::cin.get() вместо https://en.cppreference.com/w/cpp/io/basic_istream/get

bool valid{ };

while(!valid)
{

    cout << "ISBN Code: ";
    char temp = cin.get();
    size_t count {};
    while(isdigit(temp) && count < 13)
    {
        book -> isbn_code[ count++ ] = static_cast<int>(temp) - 48;
        temp = cin.get();
    }
    if (count ==13 ){
        valid =true;
        cout << "\nI got a valid ISBN\n";
    }
}

Другое дело, используйте std::string (это c++) и не используйте using namespace std;, потому что это плохая практика Почему "использование пространства имен std;" считается плохой практикой?

...