Mam taki program, który wczytuje parametry i zapisuje w zmiennych. 4-tym parametrem powinna być liczba. Aby wczytać ją do zmiennej z , posługuję się strumieniem istringstream. Jeżeli użytkownik wpisze tam tekst jako 4 parametr - wykona się instrukcja warunkowa:
Nie zauważyłem tego ale brakuje ci po cin.clear() tego:
cin.ignore(INT_MAX,'\n'); [/code]
lub tego:
[code=php]while(cin.get()!=’\n’) {}
Ponieważ jeżeli wpisałeś literki to cin.clear(); owszem przywoła cin “do porządku”, jednak w buforze zostaną te same literki, kolejny cin>>z znowu będzie je czytał.
Ahaaa, dzięki wielkie. Myślałem, że to się wczyta jakoś do tej zmiennej typu int, co prawda rozwali się, ale się wczyta, no ale jednak nie…
EDIT: 23.02.2010
Sorry, że odkopuję temat sprzed ponad pół roku, ale chciałbym się dowiedzieć dlaczego wszyscy w ignore używają makra INT_MAX. Co ciekawe czasem zamiast 2147483647 może mieć wartość równą 32767 - czyli duuuużo mniejszą.
A tymczasem istnieje sobie klasa string, której obiekty mogą mieścić maksymalnie max_size() znaków (u mnie jest to wartość równa 4294967294 czyli o jeden mniej niż makra ULONG_MAX). I jeżeli ktoś skopiuje do konsoli tyle znaków (z jakiejś powiedzmy strony internetowej/dokumentu, bo trudno samemu tyle stukać w klawiaturę ^.^), które popłyną do strumienia cin, a który - tak się złożyło - płynie sobie do zmiennej typu “liczbowego” - np. short czy int to oczywiście strumień się zablokuje. Ale zignorujemy tylko INT_MAX znaków - u mnie to będzie np. ok. połowa z 4294967294 czyli max_size(). Reszta pozostanie.
Więc dlaczego zawsze w programach spotykam się z takim zapisem, zamiast np. z:
cin.ignore(string().max_size(), '\n');//czycin.ignore(ULONG_MAX, '\n'); //sposób szybszy bo bez tworzenia obiektu chwilowego i wywoływania funkcji [/code]
:?: