Dane wejsciowe c++ - porównanie dev c++ i microsoft visual studio
Ostatnio zmodyfikowano 2016-03-26 11:43
metyl1988 Temat założony przez niniejszego użytkownika |
Dane wejsciowe c++ - porównanie dev c++ i microsoft visual studio » 2016-03-26 10:19:22 Cześć, mam taką sprawę. Chodzi o kompilowanie poniższego programu. W Dev C++ działa elegancko a w Visual Studio 2015 mam problem. W momencie wpisania błędnego znaku, w tym wypadku jakieś litery, np. 'a' - zamiast wykonywać warunek w while ( cin.fail() ) i wracać na sam początek z info, że " podana niedozwolony znak" to robi mi się nieskończona pętlę. Jeśli cin.clear() i cin.sync() dam przed cin >> wybor; to robi się nieskończona pętla cin.clear(); cin.sync(); cin >> wybor;
Jeśli damy cin.clear() i cin.sync() dam po cin >> wybor; to wykonuje się "default:" cin >> wybor; cin.clear(); cin.sync();
Nawet jak dodam cin.ignore( 1000, '\n' ); to też nic to nie pomaga. Może ma ktoś jakiś pomysł. Z góry wielkie dzięki. Poniżej cały kod. #include <iostream> using namespace std;
int main() { int wybor; cout << "************************** Witamy w dzienniku ucznia **************************\n" << endl; do { cout << "1.Stworz ucznia.\n2.Znajdz ucznia.\n3.Wyjdz." << endl; cin >> wybor; cin.clear(); cin.sync(); if( cin.good() ) { system( "cls" ); switch( wybor ) { case 1: cout << "tworzymy"; break; case 2: cout << "znajdz"; break; case 3: cout << "Wychodzimy." << endl; break; default: system( "cls" ); cout << "Podales bledna wartosc. Wracamy do samego poczatku" << endl; break; } } else { system( "cls" ); cout << "Podales niedozwolony znak." << endl; } } while( cin.fail() || wybor > 3 ); system( "Pause" ); }
|
|
carlosmay |
» 2016-03-26 10:36:35 cin >> wybor; cin.clear(); cin.sync(); if( cin.good() ) { } |
Taka kolejność jest bez sensu. Sprawdzany jest stan strumienia w if'ie zawsze dla stanu poprawnego. Spróbuj tak: cout << "1.Stworz ucznia.\n2.Znajdz ucznia.\n3.Wyjdz." << endl; while( !( std::cin >> wybor ) ) { std::cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); std::cout << "Blad wyboru. Wprowacdz ponownie"; } system( "cls" ); switch( wybor ) { } @edit: Nawet jak dodam cin.ignore( 1000, '\n' ); to też nic to nie pomaga. |
To jest bardziej uniwersalne rozwiązanie niż std::cin.sync(); i działa prawie wszędzie, tylko trzeba go poprawnie używać. |
|
metyl1988 Temat założony przez niniejszego użytkownika |
» 2016-03-26 11:43:26 Działa! :) dzięki ! |
|
« 1 » |