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

Błąd z wejściem łańcucha (C++)

0 głosów
207 wizyt
pytanie zadane 8 czerwca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam napisałem program obiektowy, który ma wpisywać dane. Obiekt string działa, jednak program zatrzymuje mi się na lańcuchu i nie wiem dlaczego.

#include "bank.h"
#include <string>
#include <iostream>

Konto::Konto(std::string nazwisko, char * nr_konta, double saldo)
{ 
        std::cout << "Nazwisko: "; std::cin >> this->nazwisko;
        std::cout << "Nr konta: "; std::cin.get(this->nr_konta, 10);
        this->saldo = 0;
}

void Konto::pokaz() { std::cout << "Aktualny stan konta: " << saldo << "\n"; }
void Konto::wplata(double kwota) { std::cin >> kwota; saldo+=kwota; }
void Konto::wyplata(double kwota) { std::cin >> kwota; saldo-=kwota; }

 

1
komentarz 8 czerwca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Pokaż wywołanie konstruktora.
komentarz 8 czerwca 2018 przez Sic Dyskutant (8,510 p.)
edycja 8 czerwca 2018 przez Patrycjerz
#include "bank.h"
#include <string>
#include <iostream>

int main()
{
        std::string klient;
        char konto[10];
        double ilosc;
        char wybor;
        Konto konto_bankowe(klient, konto, ilosc);
        std::cout << "\n\nTwoje konto bankowe!\nWybierz opcję.\n\t1. Sprawdź stan konta.\n\t2. Wpłać pieniądze.\n\t3. Wypłać pieniądze.\n\t4. Zakończ.\n\n";
        while(std::cin>>wybor)
        {
                switch(wybor)
                {
                        case '1':
                                konto_bankowe.pokaz();
                        break;
                        case '2':
                                konto_bankowe.pokaz();
                                konto_bankowe.wplata(ilosc);
                                konto_bankowe.pokaz();
                        break;
                        case '3':
                                konto_bankowe.pokaz();
                                konto_bankowe.wyplata(ilosc);
                                konto_bankowe.pokaz();
                        break;
                        case '4':
                                std::cout << "Dziekujemy !\n";
                        break;
                }//switch
        }//while
        return 0;
}//main

 

1
komentarz 8 czerwca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Pokaż deklarację klasy.
komentarz 8 czerwca 2018 przez Sic Dyskutant (8,510 p.)
#ifndef BANK_H_
#define BANK_H_

#include <string>
class Konto
{
        private:
                std::string nazwisko;
                char nr_konta[10];
                double saldo;
        public:
                Konto(std::string nazwisko, char * nr_konta, double saldo);
                void pokaz();
                void wplata(double kwota);
                void wyplata(double kwota);
};
#endif

 

1
komentarz 8 czerwca 2018 przez Patrycjerz Mędrzec (192,320 p.)

Kod wygląda w porządku. Spróbuj dać

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

po zapisie do `nazwisko`, ale przed zapisem do `nr_konta`.

komentarz 8 czerwca 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję ta linia pomogła we wszystkim.

A mógłbym prosić o jej wytłumaczenie, bo nie wiem co dokładnie robi.
komentarz 8 czerwca 2018 przez Patrycjerz Mędrzec (192,320 p.)
edycja 8 czerwca 2018 przez Patrycjerz

Powodem niezatrzymania programu do odczytu jest pozostawiony znak nowej linii w strumieniu wejścia po wcześniejszym zapisie. Znak ten jest domyślnie uważany za delimeter, czyli ogranicznik. Jeśli program znajdzie go w strumieniu, to wykonywany jest zapis do zmiennej (tak jakbyś kliknął klawisz enter po wpisaniu danych wejściowych). Jako że nic przed tym ogranicznikiem nie ma, drugi napis pozostanie pusty.

Możesz się zapytać, czemu jest to tak zaimplementowane? Sam nie wiem, nie interesowałem się tym za bardzo.

Instrukcja `ignore` powoduje, jak sama nazwa wskazuje, zignorowanie iluś znaków strumienia. Domyślnie (wywołanie bez parametrów) będzie to jeden znak i taki sposób też powinien zadziałać. Ja użyłem bardziej wszechstronnego, czyszczącego wszystko, aż do napotkania pierwszego znaku nowej linii (razem z nim).

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 17 grudnia 2015 w Java przez Int_main Bywalec (2,850 p.)
0 głosów
1 odpowiedź 185 wizyt
0 głosów
1 odpowiedź 689 wizyt
pytanie zadane 30 lipca 2019 w Sprzęt komputerowy przez Bezy Bywalec (2,280 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...