Problem z funkcją sprawdzającą wpisany znak.

0

Dlaczego program się sypie w 2 pętli while?

#include<iostream>
#include<string>

using namespace std;

int main()
{
  int i,j;
  j=1;
  while (j>0)
    {
      cout <<"Podaj rok urodzenia\n";
      cin >> i;
      while(!(cin>>i))
      {
        cout <<"???\n";
        cin.clear();
        cin.sync();
        cout <<"Podaj rok urodzenia\n";
        cin >> i;
        cout << i << "o co chodzi?\n";
      }
        if (i>1910 && i<2012)
           {
              i=2011-i;
              cout <<"Masz "<< i <<" lat\n";
              return 0;
           }
        else
            {
              cout <<"wprowadzono niepoprawny rok urodzenia\n";
            }
     }
}
0

Ponieważ tu:
while(!(cin>>i))
wprowadzasz i jeszcze raz.
Nie wiem poco tak komplikujesz:

#include<iostream>
#include<string>
 
using namespace std;
 
int main()
  {
   while(true)
     {
      cout<<"Podaj rok urodzenia: ";
      cin.sync();
      int i;
      if(cin>>i)
        {
         if(1910<i && i<2012)
           {
            cout<<"Masz "<<(2011-i)<<" lat"<<endl<<endl;
            //cin.sync(); cin.get(); // ew. zatrzymanie
            return 0;
           }
         else cout <<"wprowadzono niepoprawny rok urodzenia"<<endl<<endl;
        }
      else
        {
         cin.clear();
         cout<<"poprosze w postaci liczby"<<endl<<endl;
        }
     }
  }
0

Jesteś pewien, że twój programik działa? Bo jak go skopiowałem ze stronki i uruchomiłem to się posypał.

0

Pewnie źle skopiowałeś lub kompilowałeś nie to co skopiowałeś lub coś w tym guście.
Jedynie możesz śmiało wywalić #include <string> bo nie jest potrzebne.

0

Skopiowałem dobrze. Kurde, a może czegoś nie dodaje do kompilacji? Bo używam tylko g++. Czy to możliwe, że funkcje clear i sync mi nie diałały? Bo wygląda to trochę dziwnie bo się nie podświetlają.

0

Jeżeli odpalasz pod windows'ami przez podwójne kliknięcie, zaś pod wysypywaniem się rozumiesz zniknięcie czarnego ekranu to przeczytaj to co napisane w komentarzu.

0

Używam fedory. A program się zapentla. Gdy wpisze do programu litery, to się zapentla, wypisuje cały czas "podaj rok urodzenia: poprosze w postaci liczby".

0

To znaczy że nie działa ci albo cin.clear() albo cin.sync()
Sprawdź czy są aktualizacji do kompilatora.

0

Używam kate. Gdy wklepuje yum install kate wyskakuje że jest zaktualizowane. gcc-c++ też mam zaktualizowane

0

Po cin.clear() daj jeszcze cin.sync(). clear nie czyści strumienia, tylko zdejmuje flagę błędu, potem znowu te znaki jako liczbę próbujesz wczytać i znowu się flaga błędu ustawi

0

byku_guzio, przecież jest cin.sync() tuż przed cin>>i, czyli na to samo wychodzi.

0

Hmm, to bardzo dziwne, ale wygląda na to, że nie działa mi funkcja sync() ?!? Nie wiem czy to w ogóle jest możliwe, ale tak to wygląda.

Po wpisaniu programiku i kompilacji:

#include<iostream>

using namespace std;

int main()
{
  int zmienna;
while(!(cin>>zmienna)) //dopóki strumień jest w stanie błędu -> dopóki podawane są błędne dane
{
  //ew komunikat błędu
  cin.clear(); //kasowanie flagi błędu strumienia
  cin.sync(); //kasowanie zbędnych znaków z bufora
  cout <<"źle\n";
  cout <<zmienna;
}
cout <<"dobrze\n" <<"zmienna to "<< zmienna <<"\n";
return 0;
}

jak wpisze litere wywala;
źle
432531
i tak w kółko.

1

Co za lamy, przecież sync pod linuksem moze nie zadziałać.
Zmień sync na

while (cin.get());
0

Człowieku jesteś wielki. Działa!!! Masz u mnie piwo.

0

Nikt tak naprawdę nie może się zgodzić z tym, co funkcja sync ma robić ot i cała filozofia. Kompilator C++ pod linuksem może mieć tą funkcję jako pustą, bądź usunąć ją tak po prostu.
Żeby było ładniej zrób tak:

cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); 

nagłówek <limits>

0

Jeszcze raz Dzięki :)

0

Jeszcze jedno. Napisałem sobie drugi podobny program żeby mi na przyszłość zostało.

#include<iostream>
#include<limits>

using namespace std;
 
int main()
{
  while(cin.get())
  {
      cout<<"podaj cyfrę: ";
      cin.clear();
      int i;
      if(cin>>i)
        {
         cout<<"cyfra to "<<i<<"\n"<<endl<<endl;
         return 0;
        }
      else
        {
         cin.clear();
         cout<<"cyfrę mówię"<<endl<<endl;
         cin.ignore ( std::numeric_limits<std::streamsize>::max());
        } 
  }
}

No i chyba coś źle zrozumiałem, bo ten programik się dosłownie zawiesza (?), tzn. po wpisaniu litery do programu wypisuje:
cyfre mówie

i koniec, nie wyłącza się. Dopiero ctrl+c kończy prace.
Ale za to poprzednik:

#include<iostream>
#include<limits>

using namespace std;
 
int main()
{
   while(cin.get())
     {
      cout<<"Podaj rok urodzenia: ";
      cin.clear();
      int i;
      if(cin>>i)
        {
         if(1910<i && i<2012)
           {
            cout<<"Masz "<<(2011-i)<<" lat"<<endl<<endl;
            return 0;
           }
         else cout <<"wprowadzono niepoprawny rok urodzenia"<<endl<<endl;
        }
      else
        {
         cin.clear();
         cout<<"poprosze w postaci liczby"<<endl<<endl;
         cin.ignore ( std::numeric_limits<std::streamsize>::max());
        }
     }
}

działa bez zarzutu.

 
```
0

oba działają tak samo nie poprawnie, bo zamieniłeś:
while(true)
na:
while(cin.get())
nie wiem co miałeś na myśli robiąc to ale to czeka na wpisanie wiersza z którego "zjada" pierwszy znak.
Propozycja od ASDF dotyczyła raczej czegoś w stylu:

#include<iostream>
#include<limits>
 
using namespace std;
 
int main()
  {
   while(true)
     {
      cout<<"podaj cyfrę: ";
      int i;
      if(cin>>i)
        {
         cout<<"cyfra to "<<i<<endl<<endl; // jak wprowadzi tu 99 to też będzie ok ale to nie jest cyfra.
         return 0;
        }
      else
        {
         cin.clear();
         cout<<"cyfrę mówię"<<endl<<endl;
        }
      while(cin.get()!='\n') {}
     }
  }

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