Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dane wejsciowe c++ - porównanie dev c++ i microsoft visual studio

Ostatnio zmodyfikowano 2016-03-26 11:43
Autor Wiadomość
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
C/C++
cin.clear();
cin.sync();
cin >> wybor;

Jeśli damy cin.clear() i cin.sync() dam po cin >> wybor; to wykonuje się "default:"
C/C++
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.

C/C++
#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";
                // tworzymy();
                break;
            case 2:
                cout << "znajdz";
                //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" );
}
P-146570
carlosmay
» 2016-03-26 10:36:35
C/C++
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:
C/C++
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ć.
P-146571
metyl1988
Temat założony przez niniejszego użytkownika
» 2016-03-26 11:43:26
Działa! :) dzięki !
P-146573
« 1 »
  Strona 1 z 1