2016-12-09 17 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'に数字以外の数字を入力すると、ゼロになります。 「後で有効と考えられるものの1つではない、ある価値」とはならないでしょう。 – 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を呼び出していると思われます。

関連する問題