while 循环每次使用相同的值
While loop uses the same value each time
我的代码有问题。有 while 循环,当输入的不是数字,例如字符数据时,那么这个循环每次都使用相同的选择值。
这是一个列表,用户应该在其中选择一个变体。选择是用户的选择。应该只有整数值,我对字符有问题。
例如:
选择=一个;
所以我永远无法更改它,因为循环不起作用。
如果 choice = 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();// закрываю файл
}
}
}
choice
是一个 int
。当您执行 cin>>choice
并且用户输入非数字值时,将为 cin
设置 failbit。该位也会使所有后续输入失败,直到您使用 cin.clear()
and ignore the wrong input with 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);
}
也许对某些人有用。如果你想检查输入的字符串是否只有数值,你可以这样做:
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
}
我的代码有问题。有 while 循环,当输入的不是数字,例如字符数据时,那么这个循环每次都使用相同的选择值。 这是一个列表,用户应该在其中选择一个变体。选择是用户的选择。应该只有整数值,我对字符有问题。
例如: 选择=一个; 所以我永远无法更改它,因为循环不起作用。 如果 choice = 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();// закрываю файл
}
}
}
choice
是一个 int
。当您执行 cin>>choice
并且用户输入非数字值时,将为 cin
设置 failbit。该位也会使所有后续输入失败,直到您使用 cin.clear()
and ignore the wrong input with 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);
}
也许对某些人有用。如果你想检查输入的字符串是否只有数值,你可以这样做:
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
}