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

[Lekcja 15] cin.sync() vs cin.ignore(numeric_limits <streamsize>::max(), '\n')

Ostatnio zmodyfikowano 2013-08-15 00:43
Autor Wiadomość
Arnimarl
Temat założony przez niniejszego użytkownika
[Lekcja 15] cin.sync() vs cin.ignore(numeric_limits <streamsize>::max(), '\n')
» 2013-08-14 20:36:55
Niezwykly blad.. nie umiem zlokalizowac przyczyny.

C/C++
#include <iostream>
using namespace std;

int main()
{
    int liczba;
    do
    {
        cout << "Podaj liczbe:" << endl;
       
        cin.clear();
        cin.ignore( 1000, '\n' );
        // Posiadan Linuxa, gdzie kompiluje w terminalu, w zwiazku z czym uzylem kodu podanego przez autora lekcji, gdyz cin.sync(), tak jak autor nadmienil, niestety w moim wypadku nie dzialalo i mimo zastosowania, i tak wywolywalo nieskonczona petle.
       
        cin >> liczba;
       
       
    } while( cin.good() == 0 );
   
    cout << "Koniec" << endl;
    return 0;
}

Oto moj kod. Tak jak juz wspomnialem, posiadam Linuxa:Xubuntu. Po skompilowaniu i uruchomieniu powyzszego kodu dostaje niezwykly wynik:
Program prosi o podanie liczby... 2 razy. Niewazne, co wprowadzimy.

Oto skopiowane zachowanie programu po uruchomieniu(uruchomilem 2 razy, zeby czytajacy lepiej zobaczyl dzialanie):
UWAGA! Dla osob chcacych pomoc w kwestii kodu, a nie majacych do czynienia z poleceniami terminala, uprzejmie informuje, ze "arnimarl@ubuntu:~/kodowanie$ ./cpp" to po prostu klucz, ktory uruchamia program- jak ponizej widac.
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
test1
LOL?? dlaczego drugi raz?
Podaj liczbe:
jnxjxxnx            
Podaj liczbe:
1000
Koniec
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
1
1
Koniec
arnimarl@ubuntu:~/kodowanie$
Jestem zrozpaczony. Siedze nad tym 5 godzin. Tylu rzeczy bym sie nauczyl, ale glowie sie nad czyms, czego w zaden sposob zrozumiec nie umiem. Moze jestem zmeczony, moze po prostu niezbyt bystry. W kazdym razie bardzo prosze o pomoc.
P-90302
Arnimarl
Temat założony przez niniejszego użytkownika
» 2013-08-14 21:02:37
Adminiastrator przeczytal, ale nie odpowiedzial;( ... przeciez musi byc jakies rozwiazanie tego problemu...
P-90310
pekfos
» 2013-08-14 21:04:13
Zmień warunek:
C/C++
}
while( cin.fail() );
P-90311
Arnimarl
Temat założony przez niniejszego użytkownika
» 2013-08-14 21:09:45
Zmienilem, efekt- bez zmian: 

arnimarl@ubuntu:~/kodowanie$ gedit
arnimarl@ubuntu:~/kodowanie$ make cpp
g++     cpp.cpp   -o cpp
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
1
1
Koniec
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
m
m
Podaj liczbe:
m
Podaj liczbe:
1
Koniec


P-90312
jankowalski25
» 2013-08-14 21:19:21
Czyścisz strumień przed wprowadzeniem danych? Zrób to po ich odczytaniu!
P-90313
Arnimarl
Temat założony przez niniejszego użytkownika
» 2013-08-14 21:25:19
Zrobilem to juz wczesniej, na Pana prosbe zrobilem i teraz, zeby sie upewnic i efekt jest taki, ze program konczy sie po pierwszym wprowadzeniu danych do strumienia, niewazne czy te dane beda poprawne, czy nie.

W terminalu po uruchomieniu ma sie to nastepujaco:
arnimarl@ubuntu:~/kodowanie$ gedit
arnimarl@ubuntu:~/kodowanie$ make cpp
g++     cpp.cpp   -o cpp
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
1
Koniec
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
m
Koniec
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
m
Koniec
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
adds
Koniec
arnimarl@ubuntu:~/kodowanie$
P-90314
pekfos
» 2013-08-14 21:31:56
Sprawdź to:
C/C++
cin.clear();
cin.ignore( 1000, '\n' );
cerr << "---\n"; //wstaw tę linię i podaj log

cin >> liczba;
P-90315
jankowalski25
» 2013-08-14 21:34:24
1. Wczytujesz dane.
2. Sprawdzasz poprawność (i zapisujesz to do zmiennej typu
bool
).
3. Czyścisz strumień.
4. Przy pętli sprawdzasz wartość zmiennej.
P-90316
« 1 » 2 3
  Strona 1 z 3 Następna strona