Autor Wątek: Jak rozwiazac to zadanie ? proste pytanie  (Przeczytany 3441 razy)

Offline _user

  • Użytkownik

# Marzec 16, 2015, 02:34:57
Ogolnie to powiem wam ze nie zabardzo rozumiem dzialanie tego:
std::cin.clear();
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );

mam opis:
"Powyższy zapis ignoruje do 1000 znaków znajdujących się w strumieniu wejściowym. Jeżeli w strumieniu wejściowym zostanie napotkany znak nowego wiersza '\n' proces ignorowania znaków zostanie zakończony. Proces ignorowania znaków nie zostanie jednak zakończony gdy w buforze nie będzie więcej znaków do odczytania. Jeżeli chcesz używać tej techniki to należy czyścić strumień wejściowy po każdym wczytaniu danych by uniknąć ewentualnych problemów technicznych związanych ze sposobem działania tej metody."
No i opis tego ze to pierwsze czysci flagi bledu a drugie bufor tzn ignoruje znaki w nim.

Ale mimo wszystko nie zabardzo rozumiem, czyli jak to jest podaje pierwsza liczbe normalnie, w drugiej powiedzmy podaje znak *,  i on teraz znajduje sie w buforze wejsciowym ale jest ignorowany przez druga linijke tak ? On znika w ktoryms momencie ? i to cale , 'n/' na koncu linijki, jest opisane ze beda znaki ignorowane puki to sie tam nie pojawi, i faktycznie wpisuje to w dzialajacym programie i crashuje go z powodu wczesniej wpisanych znakow, ale gdy tego nie podam to program dziala w nieskonczonosc... a wiec jak dokladnie dziala i co robi to '\n' na koncu tego wiersza ? Ogolnie prosilbym o lopatologicznie wytlumaczenie tych dwoch linijek bo nie moge troche tego ogarnac.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Moderator

# Marzec 16, 2015, 16:51:26
Troche przekombinowane, wystarczy:
Zależy do czego. Twój kod i kod OP nie są równoważne - twój, jak na wejściu dostanie "123ABC", to zwraca liczbę 123, a tamten rzuca błędem.

Offline _user

  • Użytkownik

# Marzec 16, 2015, 20:27:11
Chce spytac w ktorym momencie ta linijka cin.ignore... napotyka '\n' ? w kodzie musi byc << endl; czy co innego ? Chcialbym wiedziec w ktorym momencie dokladnie spotyka ten znak \n oraz co sie dzieje ze znakami kiedy znajdzie juz ten znak \n ? Skoro przestaje je to co robi, wymazuje je czy co takiego ? Prosilbym o odpowiedz na te dwa pytania jeszcze.
« Ostatnia zmiana: Marzec 17, 2015, 00:29:55 wysłana przez _user »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 17, 2015, 12:51:43
Cytuj
Troche przekombinowane, wystarczy
"wczytajLiczbe" akurat idealnie nadaje się na osobną funkcję. Ot, chociażby żeby nie śmiecić w kodzie pętlami które robią rzeczy niezwiązane z samym algorytmem.

Poza tym dobry kod jest wtedy, gdy sam jest swoją dokumentacją.
O ile taki kod jest oczywisty nez żadnego komentarza:
    int number = wcytajLiczbe();
To kod poniżej powoduje już lekki zamot:
        int number = 0;
        do
        {
                std::cin.clear();
                std::cin.sync();
                std::cin >> number;
        } while (!std::cin.good());
W tym konkretnym miejscu nie interesuje nas jak liczba jest wczytywana. Interesuje nas wyłącznie sam fakt, że wczytywana jest.

Cytuj
mam opis:
"Powyższy zapis ignoruje do 1000 znaków znajdujących się w strumieniu wejściowym."
Opis jest nierzetelny już w tym miejscu - w samym kodzie liczba 1000 nie występuje. Prawdopodobnie w tej konkretnej implementacji STL wywołanie std::something<std::whatever>::max() zwracało autorowi 1000, ale nie ma żadnej gwarancji że w innym kompilatorze implementacja STL zwróci to samo.

Cytuj
jak dokladnie dziala i co robi to '\n' na koncu tego wiersza ?
'\n' to znak specjalny końca wiersza. Taki kod, który mówi, że przed tym znakiem jest jeden wiersz, a za nim drugi.

Cytuj
Chce spytac w ktorym momencie ta linijka cin.ignore... napotyka '\n' ? w kodzie musi byc << endl; czy co innego ?
"<< endl" dotyczy strumienia wyjściowego (np. cout), do którego piszesz. Ale generalnie '\n' i endl to jest to samo. W przypadku strumienia wejściowego cin znak '\n' pojawia się gdy użytkownik wciska Enter.