Я пишу проект, и я должен проверить, введен ли пользователь допустимое значение для определенных вещей. Например, первым случаем является проверка того, вводит ли он целое число, длина которого не превышает 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);
}
Следует отметить, что извлечение будет выполнено только в том случае, если содержимое, считанное из файла, может использоваться как правильное значение типа объекта (в этом случае целое число 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');
}
// ...
}
}
Сначала вы должны это проверить:
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;
}
}
while(!isdigit(artikli[i].sifra) && (dolzina_int(artikli[i].sifra) > 6) && (artikli[i].sifra) < 0){ cin >> artikli[i].sifra; }
и когда я запускаю программу, она автоматически заполняет значение и закрывается.
Предполагая, что вы хотите ограничить свой ввод целыми числами и использовать их в определенном диапазоне [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
- любые значения, которые вы хотите сохранить.
int
(это input
здесь), ввод потерпит неудачу, если вы введете что-то еще. Например, если пользователь вводит a
, бит сбоя будет установлен. Таким образом, нет необходимости проверять, является ли ввод целым числом, если вы не читаете его как строку.
main
функцию?