C++ While循环每次使用相同的值
我的代码有问题。有一个while循环,当一个enter不是一个数字,例如字符数据时,那么这个循环每次都使用相同的选择值。 这是一个列表,用户应该在其中选择一个变体。选择这是用户的选择。应该只有整数值,我对字符有问题 例如: 选择=a; 所以我不能改变它,因为循环不起作用。 若choice=2,它运行良好,我可以在循环运行时更改选项C++ While循环每次使用相同的值,c++,validation,input,while-loop,iostream,C++,Validation,Input,While Loop,Iostream,我的代码有问题。有一个while循环,当一个enter不是一个数字,例如字符数据时,那么这个循环每次都使用相同的选择值。 这是一个列表,用户应该在其中选择一个变体。选择这是用户的选择。应该只有整数值,我对字符有问题 例如: 选择=a; 所以我不能改变它,因为循环不起作用。 若choice=2,它运行良好,我可以在循环运行时更改选项 int main() { setlocale(LC_ALL, "Russian"); string fname; Data object;
int main()
{
setlocale(LC_ALL, "Russian");
string fname;
Data object;
do
{
std::cout << "Введите имя файла: ";
out << "Введите имя файла: ";
cin >> fname;
out << fname;
object.CreateAndRecordToFile(fname);
}
while (nameisright == false);
std::cout << "Создан файл для записи " << object.ffullname << endl;
out.open(object.ffullname, ofstream::out);// открываю созданный файл и говорю, что хочу в него записывать
int ch1, ch2;
bool prov = true;
int choice;
while (prov)
{
std::cout << "Выберите, пожалуйста, метод решения СЛАУ:" << endl;
out << "Выберите, пожалуйста, метод решения СЛАУ:";
std::cout << "1. Метод Гаусса \n";
out << "1. Метод Гаусса \n";
std::cout << "2. Метод LU разложения\n";
out << "2. Метод LU разложения\n";
std::cout << "3. Выход\n";
out << "3. Выход\n";
std::cout << "Ваш выбор: ";
out << "Ваш выбор: ";
cin >> choice;
//char ccc[200];
//cin >> ccc;
/*while (false){
if (strlen(ccc) != 0){
for (int i = 0; i < strlen(ccc); i++) {
if (!isdigit(ccc[1])){
std::cout << ccc[i] << " is not numeric.\n";
return false;
}
}
}
}*/
//else
//choice = stoi(ccc);
//out << ccc;
//check(choice);
switch (choice)
{
case 1: // Гаусс
{
std::cout << "Выберите, пожалуйста, метод ввода данных:" << endl;
out << "Выберите, пожалуйста, метод ввода данных: ";
std::cout << "1. Ввод данных с клавиатуры \n";
out << "1. Ввод данных с клавиатуры \n";
std::cout << "2. Ввод данных из файла \n";
out << "2. Ввод данных из файла\n";
std::cout << "3. Выход\n";
out << "3. Выход\n";
std::cout << "Ваш выбор: ";
out << "Ваш выбор: ";
cin >> ch1;
out << ch1;
switch (ch1)
{
case 1:
object.Size();
object.Init();
object.MatrixInPut();
object.InitAndInputVector();
object.printAll();
object.GaussElimination();
object.printResultGauss();
break;
case 2:
object.ReadingSize();
object.Init();
object.ReadingMatrixFromFile();
object.ReadingVectorFromFile();
object.printAll();
object.GaussElimination();
object.printResultGauss();
break;
case 3: // Просто прощайте
std::cout << endl;
out << endl;
std::cout << "Спасибо, что были с нами!\n";
out << "Спасибо, что были с нами!\n";
prov = false;
break;
default: // На случай фейлов
std::cout << endl;
out << endl;
std::cout << "Ошибка, некорректный ввод, повторите ввод.\n";
out << "Ошибка, некорректный ввод, повторите ввод.\n";
break;
}
break;
case 2: // ЛУ
{
std::cout << "Выберите, пожалуйста, метод ввода данных:" << endl;
out << "Выберите, пожалуйста, метод ввода данных: ";
std::cout << "1. Ввод данных с клавиатуры \n";
out << "1. Ввод данных с клавиатуры \n";
std::cout << "2. Ввод данных из файла \n";
out << "2. Ввод данных из файла\n";
std::cout << "3. Выход\n";
out << "3. Выход\n";
std::cout << "Ваш выбор: ";
out << "Ваш выбор: ";
cin >> ch2;
out << ch2;
switch (ch2)
{
case 1:
object.Size();
object.Init();
object.MatrixInPut();
object.printMatrix();
object.LUdecomposition();
object.printLU();
break;
case 2:
object.ReadingSize();
object.Init();
object.ReadingMatrixFromFile();
object.printMatrix();
object.LUdecomposition();
object.printLU();
break;
case 3: // Просто прощайте
std::cout << endl;
out << endl;
std::cout << "Спасибо, что были с нами!\n";
out << "Спасибо, что были с нами!\n";
prov = false;
break;
default: // На случай фейлов
std::cout << endl;
out << endl;
std::cout << "Ошибка, некорректный ввод, повторите ввод.\n";
out << "Ошибка, некорректный ввод, повторите ввод.\n";
break;
}
break;
case 3: // Просто прощайте
std::cout << endl;
out << endl;
std::cout << "Спасибо, что были с нами!\n";
out << "Спасибо, что были с нами!\n";
prov = false;
break;
default: // На случай фейлов
std::cout << endl;
out << endl;
std::cout << "Ошибка, некорректный ввод, повторите ввод.\n";
out << "Ошибка, некорректный ввод, повторите ввод.\n";
//choice = 0;
//prov = false;
}
}
out.close();// закрываю файл
}
}
}
intmain()
{
setlocale(法语,俄语);
字符串fname;
数据对象;
做
{
std::cout fname;
out选项
是一个int
选项。当您选择cin>并且用户输入一个非数字值时,failbit设置为cin
。该位也将使所有后续输入失败,直到您用清除标志并用忽略错误的输入
例如:
while ((cin>>choice).fail() && !cin.eof()) { // if failed but not eof
cout<<"Enter numeric data ! Please retry... ";
cin.clear(); // clear error state
cin.ignore(INT_MAX,'\n'); // ignore everything until then end of the line
}
if (cin.eof()) {
cerr << "FATAL ERROR: unexpected end of file"<<endl;
exit(1);
}
while((cin>>choice).fail()&&&!cin.eof()){//如果失败,但不是eof
cout可能对某些人有用。如果要检查输入字符串是否只有数值,可以通过以下方式执行:
bool is_number(const string& str)
{
auto it = str.cbegin();
while (it != str.cend() && isdigit(*it)) ++it;
return !str.empty() && it == str.cend();
}
string choice;
...
cin >> choice;
if (!is_number(choice)) {
cout << "Enter numeric data ! Please retry." << endl;
cin.clear();
}
else {
// process the number
}
bool是数字(常量字符串和str)
{
auto it=str.cbegin();
而(it!=str.cend()&&isdigit(*it))++it;
return!str.empty()&&it==str.cend();
}
字符串选择;
...
cin>>选择;
如果(!是_编号(选项)){
我知道,我只输入了一次选择,但每次都应该。我不明白。我只是需要一些帮助,伙计们。@NathanOliver我会的,这是我的第一篇帖子。我明白了,谢谢。我应该使用类似cin.clear()的东西吗或者我应该如何忽略错误的输入?两者都有!给我10分钟。我回家了,可以用一个真正的键盘来回答;-)@whoiskatrin编辑:你有函数引用的链接,还有一个示例如何进行错误处理,重新搜索用户,直到他给出正确的答案或结束输入。哦,谢谢。我不知道cin。我知道gnore()。现在我明白了,我可以问一下吗?什么是“cerr”和cin.eof()?cerr
类似于cout
,但它只用于显示错误。cin.eof()告诉您在上次尝试读取输入时是否遇到了文件结尾。如果您想要一个常量迭代器,请使用cbegin()和cend()