Как я могу проверить, ввел ли пользователь правильное значение?

0

Я пишу проект, и я должен проверить, введен ли пользователь допустимое значение для определенных вещей. Например, первым случаем является проверка того, вводит ли он целое число, длина которого не превышает 6 и> 0. Я работаю со структурой, поэтому мой код таков:

#include <iostream>

using namespace std;

int dolzina_int(int vlez);

int main()
{
    struct pole{
        int sifra;              // sifra na artiklot
        string opis;            // opis na artiklot
        float cena;             // edinecna cena
        int vlez_kol;           // vlezna kolicina
        int izlez_kol;          // izlezna kolicina
        float dan_stapka;       // danocna stapka
        float iznos;            // iznos
        int datum;              // datum na vlez i izlez (GGMMDD)
    }artikli[100];              // maksimalen broj na artikli e 100


    for (int i = 0; i < 5; i++){

        cin >> artikli[i].sifra;

        while(!(cin >> artikli[i].sifra) ||
              (artikli[i].sifra < 0 || (dolzina_int(artikli[i].sifra) > 6)))
            {
                cout << "Error" << endl;
                cin.clear();
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            }
        }


    return 0;
}

// funkcija za dolzina na integer
int dolzina_int(int vlez){
    int dolzina = 1;
    while(vlez > 0){
        dolzina++;
        vlez /= 10;
    }
    return dolzina;
}

Итак, мой код, похоже, работает, первая часть, он проверяет, если он> 6 или <0, но второй, если он работает неправильно, чтобы проверить, является ли это целым числом или нет. Поэтому мой вопрос заключается в следующем: как я могу убедиться, что это целочисленное значение, которое вводит пользователь, и как я могу убедиться, что длина целого не равна> 6, или значение <0, а между тем, если это так, сделать он снова вводит его, а также проверяет вновь введенное значение, поскольку мой код этого не делает в настоящее время.

for (int i = 0; i < 5; i++){

    artikli[i].sifra = 1;

    do{
        cout << "Enter a code: ";
        while(!(cin >> artikli[i].sifra)){
            cin.clear();
            cin.ignore();
            cout << "Invalid entry. Enter a new value: ";
        }
    }while(artikli[i].sifra > 0 && dolzina_int(artikli[i].sifra) > 6);
}
  • 0
    Я постараюсь помочь. Можете ли вы показать мне ваш класс, пожалуйста, и всю вашу main функцию?
  • 0
    Обновлен весь исходный код (текущий) в основном посте.
Показать ещё 4 комментария
Теги:
struct
integer

3 ответа

3
Лучший ответ

Следует отметить, что извлечение будет выполнено только в том случае, если содержимое, считанное из файла, может использоваться как правильное значение типа объекта (в этом случае целое число sifra). Если он не работает, ios_base::failbit будет установлен в состоянии потока.

Итак, что нужно сделать, так это то, что когда задано неправильное значение, мы отбрасываем неправильный текст, очищаем состояние потока и повторяем его. Например:

#include <iostream>
#include <string>
#include <limits>

int main()
{
    for (int i = 0; i < 5; ++i)
    {
        while (!(std::cin >> artikli[i].sifra) ||
                ((artikli[i].sifra < 0) || (artikli[i].sifra > 6)))
        {
            std::cout << "Entered an incorrect value, try again.\n";
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        // ...
    }
}
  • 0
    Я должен использовать struct, и программа не завершена полностью, поэтому в ней так много переменных, что я объявил их для будущего использования.
  • 0
    @ user3002211 Несмотря на это, все еще идиоматично использовать вставку для пользовательских классов.
Показать ещё 12 комментариев
0

Сначала вы должны это проверить:

http://www.cplusplus.com/reference/cctype/

Во-вторых, я думаю, что ваше усложнение...

1) Чтение в int

2) проверить значение int

3) повторить

Поэтому я бы сделал это

для (i = 0 to я <5 добавить один к i)

while (введенное значение не является цифрой)

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

Что-то вроде этого:

for(i = 0; i < 5; i++) {
   cout << "Enter the code" << endl;
   cin >> artikli[i].sifra;
   while(!is_digit) {
      cout << "Invalid, please repeat" << endl;
      cin >> artikli[i].sifra;
   }
}
  • 0
    Мой код такой: while(!isdigit(artikli[i].sifra) && (dolzina_int(artikli[i].sifra) > 6) && (artikli[i].sifra) < 0){ cin >> artikli[i].sifra; } и когда я запускаю программу, она автоматически заполняет значение и закрывается.
  • 0
    Я не понимаю, что делает ваш код ... Вы должны сказать мне, что ваши функции делают или даже значат, потому что что-то вроде "сифра" не говорит мне, что оно делает ... Извините, я думаю, что мы не пишем английский здесь.
Показать ещё 1 комментарий
0

Предполагая, что вы хотите ограничить свой ввод целыми числами и использовать их в определенном диапазоне [min, max], вы сделали бы это следующим образом:

int input = -1;
do
{
    std::cout << "Enter a value in the range [min, max]:  ";
    while (!(std::cin >> input)) // while the input is invalid
    {
        std::cin.clear(); // clear the fail bit
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore the invalid entry
        std::cout << "Invalid Entry!  Please Enter a valid value:  ";
    }
} while (min > input || max < input);

Где min и max - любые значения, которые вы хотите сохранить.

  • 0
    Я хочу проверить, вводил ли пользователь в первую очередь целое число, если он это сделал, то я хотел бы проверить, больше ли оно, чем 0, и является ли его длина меньше или равной 6. Если это так, то переходите к следующему, иначе повторно введите новое целое число.
  • 0
    Если тип является целым int (это input здесь), ввод потерпит неудачу, если вы введете что-то еще. Например, если пользователь вводит a , бит сбоя будет установлен. Таким образом, нет необходимости проверять, является ли ввод целым числом, если вы не читаете его как строку.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню