2016-12-09 5 views
0

Я много исследовал эту проблему, нашел ответы и исправил свой код, но я все еще не могу получить 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; 
} 
} 
+1

Вы уверены, что проблема с 'ясно()' и 'игнорировать()' и не в каком-то другом предположении, что ваш код делает? Потому что, если вы * уверены, у вас должен быть * более короткий *, компилируемый пример всего нескольких строк, которые все могут использовать для воспроизведения вашей проблемы. (Не вдаваясь в названия городов, расчет расстояний и т. Д.) Мы называем это [MCVE] (http://stackoverflow.com/help/mcve). – DevSolar

+1

Если пользователь вводит не номер в 'start', он будет равен нулю. Это не будет «некоторая ценность, которая не является одной из тех, которые я позже считаю действительными». – molbdnilo

+2

И извлеченный здесь урок: для обработки строки текста, введенной пользователем, всегда используйте 'std :: getline()', и вам не придется шуметь, пытаясь очистить и сбросить неудачный входной поток. Вот что означает 'std :: getline()', а не оператор '>>'. –

ответ

0

Вы должны использовать cin.fail() вместе с вашими условиями

if(cin.fail()||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(); 
} 
2

В конце концов, все эти типизированные читатели оказались бесполезными и безумными, чтобы попытаться сделать работу для чтения интерактивного ввода. Вы в основном вступаете в борьбу с терминалом и входным буфером.

cin.clear() не делает ничего рационального при работе со стандартным вводом и parse-reprompt для интерактивных сеансов. Вы не должны его называть.

Перепишите все с точки зрения cin.getline() и проанализируйте полученную строку, и вы сможете понять режимы сбоев и исправить их.

0

Ваш код works fine, если ваш main() выглядит следующим образом:

int main() { detailLoop(); } 

Я подозреваю, что вы вызываете detailLoop внутри цикла, что может вызвать бесконечный цикл.