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

时间:2013-11-27 20:06:54

标签: c++ struct integer

我正在编写一个项目,我必须检查用户是否输入了特定事物的有效值。例如,第一种情况是检查他是否输入了一个整数,该整数不超过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;
}

所以,我的代码似乎工作,第一部分,它确实检查它是&gt; 6还是&lt; 0,但是第二部分,如果它不能正常检查它是否是整数。所以我的问题如下,我怎样才能确保它是用户输入的整数值,如何确保整数的长度不是> 6或者值是&lt; 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);
}

3 个答案:

答案 0 :(得分: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');
        }
        // ...
    }
}

答案 1 :(得分:0)

首先你应该看看这个:

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

其次,我认为你过度复杂了......

1)读入int

2)检查int的值

3)重复

所以我会这样做

for(i = 0到i&lt; 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;
   }
}

答案 2 :(得分: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);

minmax是您希望保持值之间的任何值。