即使在我使用cin.ignore()之后,C ++ cin也会被跳过

时间:2014-08-18 02:01:28

标签: c++ arrays cin

为了说清楚,我对C ++很新。 但我写了一个非常小的程序来测试我的数组技能并遇到cin的问题。

如果用户输入数字,就像程序期望的那样,一切都很好。但是如果输入一个字符串,则跳过所有输入并且程序结束。

我设置了所有输入:cin >> x;cin.clear();cin.ignore();

那是什么错误?

以下是完整代码:

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    system("cls");
    int create = 1;
    int entry;
    int x;
    string chc;
    cout << "How long should the array be?" << endl;
    cout << ":";
    cin >> x;cin.clear();cin.ignore();
    if(x<1){x=1;}
    int myArray[x];
    string askcontinue;
    for(int x=0;x<sizeof(myArray)/sizeof(myArray[0]);x++){
        system("cls");
        cout << "Enter value #" << x+1 << endl;
        cout << ":";
        cin >> entry;cin.clear();cin.ignore();
        myArray[x]=entry;
    }
    system("cls");
    cout << "Index - Value" << endl;
    for(int x=0;x<sizeof(myArray)/sizeof(myArray[0]);x++){
        cout << x << " ------ " << myArray[x] <<endl;
    }
    system("cls");
    cout << "Restart? [Y/N]" << endl;
    cout << ":";
    cin >> chc;cin.clear();cin.ignore();
    if(chc=="y" || chc=="Y"){main();}
}

2 个答案:

答案 0 :(得分:3)

cin >> x;cin.clear();cin.ignore();

你在整个程序中所做的事情是问题的一部分。如果用户输入的内容不符合整数的格式要求,则流将进入故障状态。在此之后,您将清除流并清除下一个字符。如果用户输入了多个字符作为无效输入的一部分,则ignore()调用只是丢弃下一个字符,而不是所有无效输入。

您需要检查输入是否成功,然后使用需要丢弃的字符数的ignore()重载来丢弃输入。如果您希望在没有提供有效字符时始终要求用户输入,请执行以下操作:

while (!(std::cin >> x)) {
    std::cout << "How long should the array be?" << std::endl;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

但是从您的代码判断,看起来您不想反复询问用户输入。在这种情况下,您应该检查有效输入而不在无效情况下执行任何操作:

if (std::cin >> x) {
    ...
}

此外,VLA(或可变长度数组)是C ++的非标准功能,在某些编译器中作为扩展提供。不要使用它们。相反,使用std::vector动态分配:

std::vector<int> myArray(x);

答案 1 :(得分:1)

注意:您还应该更改将变量'x'定义三次

的事实

您遇到的问题是,c输入没有进行类型检查,因此它不关心输入的内容,因此这取决于您。你应该把所有东西作为字符串输入,然后确保字符串只包含数字,然后你可以使用std :: stoi,或者任何适当的转换方法。如果他们不输入有效数字,那么你可以说INVALID,并告诉用户输入有效数字,然后回到输入,你可以使用如下内容:

system("cls");
cout << "Enter value #" << x + 1 << endl;
cout << ":";
cin >> entry; cin.clear(); cin.ignore();
while(!is_valid_integer(entry))
{
    system("cls");
    cout << "INVALID NUMBER \n Enter value #" << x + 1 << endl;
    cout << ":";
    cin >> entry; cin.clear(); cin.ignore();
}
myArray[x] = std::stoi(entry);

然后输入是一个字符串。

is_valid_integer将被定义为:

bool is_valid_integer(std::string str)
{
    for(auto it : str)
    {
        if(!(ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' || ch == '5' || ch == '6' || ch == '7' || ch == '8' || ch == '9'))
            return false;
        //OR:  this is more efficient, but is reliant on using ascii codes (which in this case we are)
        //if(!(ch >=48 && ch <= 57)) return false;
    }
    return true;//all numbers
}