我的代码存在问题。有循环,当输入不是数字和例如字符数据时,那么这个循环每次使用相同的选择值。 它是一个列表,用户应该选择其中一个变体。选择它是用户的选择。应该只有整数值而我遇到问题。
例如: 选择= a; 所以我无法改变它,因为循环不起作用。 如果选择= 2,它运行良好,我可以在循环工作时改变选择。
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();// закрываю файл
}
}
}
答案 0 :(得分:1)
choice
是int
。当您执行cin>>choice
并且用户输入非数字值时,会为cin
设置failbit。此位将使所有后续输入也失败,直到您使用 cin.clear()
清除该标记,并使用 cin.ignore()
忽略错误的输入。
示例:
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);
}
答案 1 :(得分:1)
也许这对某人有用。如果要检查输入字符串是否只有数字值,可以这样做:
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
}