Do while - nie chce pobrać wartości.

0

Dzień dobry.
Nie wierzę, że to nie działa.

#include <iostream>
using namespace std;
int main()
{
    int a;
    
    do{
        cin.clear();                           //czyszczę
        cin.sync();                           //bufor
        cout << "podaj liczbe\n";              //pyta
        cin >> a;                             //odpowiadam
    }
    while (cin.fail());                      //jeśli cin.fail() == 1, powtarza pętlę
        
        cout << "liczba "<< a << endl;
    
    return 0;
}

Dlaczego nie działa?

0

Nie rozumiem.

0

Nie czyścisz strumienia:

#include <iostream>
using namespace std;

int main()
{
    int number;
    do{
        int temp;
        cin.clear();
        cin >> temp;
        if(cin.fail()) {
            cout << "Not a number !" << endl;
        } else {
            number = temp;
        }
    }while(!cin.fail());
    cout << "Last validate number is " << number << endl;
    system("pause");
    return 0;
}
0
JakubD napisał(a):

do{
cin.clear();
cin.sync();
cout << "podaj liczbe\n";

Myslałem, ze tak. Nie bardzo widzę różnicę między tymi programami. Wykrzyknik w Twoim while'u.

1

poprawniej dać:

    do
      {
       cin.clear();
       cin.sync();
       cout<<"podaj liczbe: ";
      }
    while(!(cin>>a));
0

Wyrażenie dla while musi być z poza pętli?

0

Jak chcesz pod linuks lub uniwersalnie to:

#include <iostream>
using namespace std;
 
int main()
  {
    int number;
    for(bool bad=true;bad;)
      {
       cout<<"podaj liczbe: ";
       bad=!(cin>>number);
       if(bad)
         {
          cin.clear();
          cout<<"Blad wprowadzenia"<<endl; // komunikat można pominąć
         }
       while(cin.get()!='\n') {} // czyścimy bufor niezależnie od tego pobrano liczbę dobrze czy nie
      }
   cout<<number<<endl;
   return 0;
  }

wersja bez komunikatu:

#include <iostream>
using namespace std;
 
int main()
  {
    int number;
    for(bool bad=true;bad;)
      {
       cout<<"podaj liczbe: ";
       bad=!(cin>>number);
       cin.clear();
       while(cin.get()!='\n') {}
      }
   cout<<number<<endl;
   return 0;
  }
0

HAHA

0
 #include <iostream>
using namespace std;
int main()
{
    int a;
    
    do{
        cin.clear();                           //czyszczę
        cin.ignore(10, '\n');                           //bufor
        cout << "podaj liczbe\n";              //pyta
        cin >> a;                             //odpowiadam
    }
    while (cin.fail());                      //jeśli cin.fail() == 1, powtarza pętlę
    
    cout << "liczba "<< a << endl;
    
    return 0;
}
0

Czyli nie da się tego zrobić tak jak chciałem?

1
JakubD napisał(a):

Czyli nie da się tego zrobić tak jak chciałem?
...
while(cin.fail()) chciałem:).
Doprawdy? Więc masz duży problem, bo naprawdę nie wiesz czego chcesz:

#include <iostream>
using namespace std;
 
int main()
  {
    int number;
    do
      {
       cin.clear();
       cout<<"podaj liczbe: ";
       bool ok=(cin>>number);
       cin.clear();
       while(cin.get()!='\n') {}
       if(!ok) cin.clear(ios::failbit);
      } while(cin.fail()); // można zamienić na while(!cin);
   cout<<number<<endl;
   return 0;
  }

Niby tak jak chciałeś tylko że to lewą ręką za prawe ucho, tylko aby zachcianki spełnić.

Zanotuj sobie że to kod należy pisać wedle potrzeb a nie naginać potrzeby pod kod który chcesz zobaczyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1