如何检查用户是否输入了有效值

How can I check if the user has entered valid value?

本文关键字:是否 输入 有效值 用户 何检查 检查      更新时间:2023-10-16

我正在写一个项目,我必须检查用户是否为特定内容输入了有效值。例如,第一种情况是检查他是否输入了一个长度不超过6且大于0的整数。我正在使用struct,所以我的代码是这样的:

#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将被设置为流状态。

因此,需要做的是,当给出不正确的值时,我们丢弃错误的文本,清除流状态,然后重新尝试extaction。例如:

#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到i<5加1到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;
   }
}

假设您想将输入限制为整数,并将它们限制在特定的[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);

其中minmax是您希望将值保持在两者之间的任何值。