• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

jak ponownie poprosić o cina

Object Storage Arubacloud
0 głosów
165 wizyt
pytanie zadane 5 czerwca 2022 w C i C++ przez wasiu Nowicjusz (140 p.)
edycja 5 czerwca 2022 przez wasiu

Hej, zaczałem się uczyć c++ pare dni temu i generalnie idzie mi to raczej średnio no i mam takie pytanko bo nie mogę przez to przebrnąć

#include <iostream>

using namespace std;

string imie, nazwisko;
int telefon;

int main()
{
    cout << "podaj imie" << endl;
    cin>>imie;
     cout << "podaj nazwisko" << endl;
   cin>>nazwisko;
   cout << "podaj nr telefonu" << endl;
          if (!(cin>>telefon))
         {

           cout<<"To nie jest numer"<<endl;
                   cout << "podaj prawidlowy numer telefonu" << endl;
                     cin>>telefon;
         }

Myślę, że dla kogoś kto się zna to jakiś banał bo chcę żeby program zapytał o wprowadzenie numeru jeszcze raz - jeśli używtkownik zamiast numeru poda jakieś znaki lub litery i kombinowałem na milion sposobów z jakimiś pętlami ale no ni huhu nie umiem tego zrobić bo albo pętla wykonuje mi się w nieskończoność i wyrzuca cały czas na konsole to 

 cout<<"To nie jest numer"<<endl;
                   cout << "podaj prawidlowy numer telefonu" << endl;

lub jak w tym wypadku jaki wkleiłem to po prostu wyrzuca na konsole te dwa napisy, że to nie jest numer i podaj prawidłowy numer i od razu się zakańcza program nie pytając ponownie o niego ale przecież jest znowu linijka  

                    cin>>telefon;

 więc czemu tak się dzieje? Jak to poprawić?

komentarz 5 czerwca 2022 przez Wiciorny Ekspert (269,790 p.)
sformatuj pytanie, kod umieść w odpowiednie bloczki

2 odpowiedzi

+4 głosów
odpowiedź 5 czerwca 2022 przez Apled Dyskutant (9,520 p.)
    while (!(cin >> telefon))
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "To nie jest numer" << endl;
        cout << "podaj prawidlowy numer telefonu" << endl; 
    }

Jeżeli nie będzie chciało działać to dodaj bibliotekę <limits>.

Chodzi o to, żeby wyczyścić już podany cin, bo w takim przypadku jak u Ciebie, on ciągle przechowuje niepożądaną wartość. Do tego if nie pasuje, bo on poprosi o kolejną próbę tylko raz.

Ewentualnie możesz użyć cin.fail()

    cin >> telefon;
    while (cin.fail())
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "To nie jest numer" << endl;
        cin >> telefon;
    }

Rozwiązanie nie jest do końca niezawodne, bo jak spróbujesz wpisać wartość np, 123def789 to wartość zostanie przyjęta, ale jak podasz np. abc456789

komentarz 5 czerwca 2022 przez wasiu Nowicjusz (140 p.)

O super! Działa idealnie tak jak sobie wymyśliłem tylko mam takie pytanko odnośnie tego kodu żeby go zrozumieć.

jJak się domyślam bo nie ciężko w tym wypadku to ta linijka 

   cin.clear();

oznacza po prostu tak jak mówiłeś wyczyszczenie tego cina żeby już nie przechowywał tej złej wartości

a ta druga linia?

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

byłbym bardzo wdzięczny jakbyś opisał mi o co w niej właściwie chodzi

komentarz 5 czerwca 2022 przez Apled Dyskutant (9,520 p.)

dokładniej mówiąc to cin.clear() ma wyczyścić błąd w cin'ie (error flag), a cin.ignore() wyczyścić buffor, potrzebujesz obu, bo jakby nie było działasz cały czas na tym samym cin'ie - nie robisz kolejnego za każdym razem gdy odpowiedź jest zła.

Przy cin.ignore() argument numeric_limits<streamsize>::max() ma wskazać, że czyścisz cały string, aż do '\n', czyli do nowej linii. Jeżeli zostaniesz na argumentach domyślnych (puste nawiasy), to while będzie ci działał dla każdego znaku. Sam sobie to przetestuj, w kodzie - żeby zobaczysz jak to działa - zostaw cin.ignore() bez argumentów i wpisz zły numer, np wpisz samo A, potem AB, później ABC, a zobaczysz, że to co jest wewnątrz while będzie wywoływane następująco: raz, dwa razy, potem trzy razy - tak jak rośnie rozmiar bufforu.

komentarz 5 czerwca 2022 przez wasiu Nowicjusz (140 p.)
bomba, dzieki wielkie za wytłumaczenie
+1 głos
odpowiedź 5 czerwca 2022 przez Great Stary wyjadacz (12,360 p.)
#include <iostream>
#include <limits>

int main()
{
    std::string imie, nazwisko;
    int telefon;

    std::cout << "podaj imie\n";
    std::cin >> imie;
    std::cout << "podaj nazwisko\n";
    std::cin >> nazwisko;
    std::cout << "podaj nr telefonu\n";
    while (!(std::cin >> telefon))
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        
        std::cout << "To nie jest numer\n";
        std::cout << "podaj prawidlowy numer telefonu\n";
    }
}

Podobne pytania

0 głosów
1 odpowiedź 972 wizyt
pytanie zadane 25 sierpnia 2019 w JavaScript przez kodowiec Początkujący (410 p.)
0 głosów
1 odpowiedź 580 wizyt
pytanie zadane 1 czerwca 2019 w C i C++ przez Karol Bychowski Nowicjusz (140 p.)
+1 głos
1 odpowiedź 988 wizyt
pytanie zadane 2 października 2017 w JavaScript przez emczek Nowicjusz (190 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...