Я много исследовал эту проблему, нашел ответы и исправил свой код, но я все еще не могу получить cin.clear()
и cin.ignore()
для работы. Это часть моего кода, я имею в виду:cin.clear() и cin.ignore() не будут работать
if(cityname1 == "Error" || cityname2 == "Error")
{
cout << "**********ERROR! PLEASE ENTER 0-5 FOR YOU LOCATIONS**********" << endl << endl;
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
detailLoop();
}
else
{
cout << "The distance from " << cityname1 << " to " << cityname2;
cout << " is approximately " << cityarray[start][finish] << " miles." << endl << endl;
}
сообщение об ошибке выводится, если пользователь вводит число, отличное от 0-5, но если они ввести символ, код переходит в бесконечный цикл , После проведения исследования, я чувствую, что этот код должен работать, но, к сожалению, я не могу его получить. Кроме того, я новичок, поэтому, если у кого-то есть советы по тому, как это написано, пожалуйста, критикуйте !!! Вот и вся функция, если это помогает. Я сделал #include<limits>
.
void detailLoop()
{
//initializes array(letters in comments stand for city;
//array values are the distances)
int cityarray[6][6] = {
//DB-DB,DB-G,DB-J,DB-M,DB-Tall,DB-Tampa
0,97,90,268,262,130,
//G-DB,G-G,G-J,G-M,G-Tall,G-Tampa
97,0,74,337,144,128,
//J-DB,J-G,J-J,J-M,J-Tall,J-Tampa
90,74,0,354,174,201,
//M-DB,M-G,M-J,M-M,M-Tall,M-Tampa
268,337,354,0,475,269,
//Tall-DB,Tall-G,Tall-J,Tall-M,Tall-Tall,Tall-Tampa
262,144,174,475,0,238,
//Tampa-DB,Tampa-G,Tampa-J,Tampa-M,Tampa-Tall,Tampa-Tampa
130,128,201,269,238,0
};
//starting location
int start = 0;
//destination
int finish = 0;
//strings used to print city names
string cityname1;
string cityname2;
//menu block
cout << "Choose locations from the menu below:" << endl;
cout << "0 - Daytona Beach" << endl;
cout << "1 - Gainesville" << endl;
cout << "2 - Jacksonville" << endl;
cout << "3 - Miami" << endl;
cout << "4 - Tallahassee" << endl;
cout << "5 - Tampa" << endl << endl;
//user input for starting city
cout << "Enter your starting location: > "; cin >> start;
//user input for ending city
cout << "Enter your destination: > "; cin >> finish; cout << endl;
//assigns names to cityname1 so it can be printed
switch(start)
{
case 0:
cityname1 = "Daytona Beach";
break;
case 1:
cityname1 = "Gainesville";
break;
case 2:
cityname1 = "Jacksonville";
break;
case 3:
cityname1 = "Miami";
break;
case 4:
cityname1 = "Tallahassee";
break;
case 5:
cityname1 = "Tampa";
break;
default:
cityname1 = "Error";
break;
}
//assigns names to cityname2 so it can be printed
switch(finish)
{
case 0:
cityname2 = "Daytona Beach";
break;
case 1:
cityname2 = "Gainesville";
break;
case 2:
cityname2 = "Jacksonville";
break;
case 3:
cityname2 = "Miami";
break;
case 4:
cityname2 = "Tallahassee";
break;
case 5:
cityname2 = "Tampa";
break;
default:
cityname2 = "Error";
break;
}
if(cityname1 == "Error" || cityname2 == "Error")
{
cout << "**********ERROR! PLEASE ENTER 0-5 FOR YOU LOCATIONS**********" << endl << endl;
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
detailLoop();
}
else
{
cout << "The distance from " << cityname1 << " to " << cityname2;
cout << " is approximately " << cityarray[start][finish] << " miles." << endl << endl;
}
}
Вы уверены, что проблема с 'ясно()' и 'игнорировать()' и не в каком-то другом предположении, что ваш код делает? Потому что, если вы * уверены, у вас должен быть * более короткий *, компилируемый пример всего нескольких строк, которые все могут использовать для воспроизведения вашей проблемы. (Не вдаваясь в названия городов, расчет расстояний и т. Д.) Мы называем это [MCVE] (http://stackoverflow.com/help/mcve). – DevSolar
Если пользователь вводит не номер в 'start', он будет равен нулю. Это не будет «некоторая ценность, которая не является одной из тех, которые я позже считаю действительными». – molbdnilo
И извлеченный здесь урок: для обработки строки текста, введенной пользователем, всегда используйте 'std :: getline()', и вам не придется шуметь, пытаясь очистить и сбросить неудачный входной поток. Вот что означает 'std :: getline()', а не оператор '>>'. –