为了说清楚,我对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();}
}
答案 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
}