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

Czekanie na odpowiedź użytkownika

0 głosów
1,379 wizyt
pytanie zadane 18 kwietnia 2019 w C i C++ przez Rajzok Początkujący (390 p.)

Dzień dobry :-) Piszę program w C++,  jest to kreator państw (tworzę grę). Ma on za zadanie zebrać dane i zapisać je w pliku tekstowym. Wszystko działa dobrze, jednakże przy pytaniu o nazwę stolicy program nie czeka na odpowiedź od użytkownika. Wysyłam część kodu, w której znajduje się powyższe zapytanie. W tym programie zmienna string przechowująca nazwę stolicy to m1_nazwa .

default:
        cout << "Wprowadzona liczba niczego nie okresla";
    }
    system("cls");

    //wybor nazwy stolicy (m1_nazwa)

    cout << "Wpisz nazwe stolicy: "; getline(cin, m1_nazwa);

    //pierwsza funkcja stolicy to domyslnie administracyjna (m1_funkcja1)
    //wybor drugiej funkcji stolicy (m1_funkcja2)

    cout << "Domyslnie pierwsza funkcja stolicy to administracyjna." << endl;
    cout << "Wybierz druga inna funkcje stolicy" << endl;
    cout << "1. Obronna" << endl;
    cout << "2. Przemyslowa" << endl;
    cout << "3. Uslugowa" << endl;
    cout << "4. Handlowa" << endl;
    cout << "5. Transportowa" << endl;
    cout << "6. Edukacyjna" << endl;
    cout << "7. Turystyczna" << endl;
    cout << "8. Uzdrowiskowa" << endl;
    cout << "9. Religijna" << endl;
    cout << "Twoj wybor: "; cin >> wybor;

 

komentarz 18 kwietnia 2019 przez jankustosz1 Nałogowiec (37,030 p.)
Wypisz co siedzi w m1_nazwa po getlinie

Obstawiam że wcześniej używałeś cina i są w nim dane z poprzedniej linii

2 odpowiedzi

+1 głos
odpowiedź 19 kwietnia 2019 przez j23 Mędrzec (195,220 p.)
wybrane 20 kwietnia 2019 przez Rajzok
 
Najlepsza

Jeśli czytasz przed std::getline jakąś liczbę operatorem >>, wtedy musisz ściągnąć ze strumienia znak końca linii. Najprościej użyć do tego manipulatora std::ws:

std::cin >> v;

std::getline(std::cin >> std::ws, line);

 

komentarz 20 kwietnia 2019 przez Rajzok Początkujący (390 p.)
OK, ale gdzie w tym kodzie wpisać nazwę zmiennej m1_nazwa, aby mogło się to do niej zapisać?
komentarz 20 kwietnia 2019 przez Rajzok Początkujący (390 p.)
Już nieważne ;-) , wpisałem m1_nazwa zamiast line i wszystko działa jak należy. Dzięki wielkie, pozdrawiam i zdrowych, wesołych świąt wielkanocnych :-)
+2 głosów
odpowiedź 19 kwietnia 2019 przez gagyn Stary wyjadacz (11,050 p.)

Sprawdź co program zapisuje do zmiennej m1_nazwa, tak jak już napisał @jankustosz1, być może zostały w buforze jakieś dane, które są wczytywane do tej zmiennej zanim użytkownik zdąży cokolwiek zrobić.

Ewentualnie możesz spróbować np. cin.sync().

Więcej: https://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer

komentarz 19 kwietnia 2019 przez Szahid Pasjonat (20,970 p.)
Kolega wyżej najpewniej ma racje ze cos zalega w buforze. Pewnie wczesniej uzyleś cin, który zostawia za sobą znak nowej lini i getline go pobiera. Zwroc uwage  na druga od góry odpowiedz z tego linku  wyzej.

Druga możliwoscia jest  to że objekt cin moze być "uszkodzony" w skutek wprowadzenia wczesniej niepoprawnych danych. Aby to naprawić musisz wyczyscić bufer(druga odpowiedz z linku powyzej) i wycyscić flagi błędów za pomocą cin.clear()
komentarz 20 kwietnia 2019 przez Rajzok Początkujący (390 p.)

@gagyn, @Szahid

Okazało się, że to problem ze znakiem końca linii, który tam zalegał, przez co getline pobierał pustą linijkę. Wystarczyło  wpisać:

std::getline(std::cin >> std::ws, nazwa_zmiennej)

Teraz wszystko działa. Dzięki za pomoc i wesołych, zdrowych świąt wielkanocnych ;-)
 

Podobne pytania

0 głosów
4 odpowiedzi 2,672 wizyt
pytanie zadane 15 grudnia 2017 w C i C++ przez n0s1gnal Użytkownik (700 p.)
+2 głosów
3 odpowiedzi 745 wizyt
pytanie zadane 13 grudnia 2021 w PHP przez Bakkit Dyskutant (7,600 p.)
0 głosów
2 odpowiedzi 1,637 wizyt
pytanie zadane 13 kwietnia 2019 w C i C++ przez Rajzok Początkujący (390 p.)

93,800 zapytań

142,768 odpowiedzi

323,461 komentarzy

63,421 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...