kicuch Temat założony przez niniejszego użytkownika |
[Kurs C++] Poziom 3, Lekcja 26 » 2016-12-14 12:23:22 Czesc, Czy mógłbym prosić o pomoc, co jest nie tak z programem? Znaczy, wpisuje dane i za każdym razem ucina mi pierwsza litere lub cyfre :( #include <iostream> #include<string> using namespace std;
void sprawdz( int & wiek ) { do { cin.clear(); cin.ignore(); cin >> wiek; } while( cin.fail() == 1 ); }
void wczytajOsobe( string & iimie, string & nnazwisko, int & wwiek ) { cout << "Podaj imie: " << endl; cin >> iimie; cout << "Podaj nazwisko: " << endl; cin >> nnazwisko; cout << "Podaj wiek: " << endl; sprawdz( wwiek ); } void wypiszOsobe( string imie_w, string nazwisko_w, int wiek_w ) { cout << "--------------------------------------------" << endl; cout << "Imie: " << imie_w << endl; cout << "Nazwisko: " << nazwisko_w << endl; cout << "Wiek: " << wiek_w << endl; cout << "--------------------------------------------" << endl; } int main() { std::string imie[ 2 ]; std::string nazwisko[ 2 ]; int wiek[ 2 ]; for( int i = 0; i < 2; i++ ) wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); for( int i = 0; i < 2; i++ ) wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); return 0; }
|
|
carlosmay |
» 2016-12-14 13:19:59 |
|
kicuch Temat założony przez niniejszego użytkownika |
» 2016-12-14 13:33:28 Ok ;)
Jeśli usunę linie z cin.ignore();, to przy uruchomieniu programu i wpisywaniu danych, pominie wpisywanie imienia przy drugiej osobie. Czemu tak się dzieje?
|
|
carlosmay |
» 2016-12-14 16:17:55 #include <iostream> #include<string> #include <limits> using namespace std;
void wczytajOsobe( string & iimie, string & nnazwisko, int & wwiek ) { cout << "Podaj imie: " << endl; getline( cin, iimie ); cout << "Podaj nazwisko: " << endl; getline( cin, nnazwisko ); cout << "Podaj wiek: " << endl; while( !( cin >> wwiek ) ) { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } void wypiszOsobe( string imie_w, string nazwisko_w, int wiek_w ) { cout << "--------------------------------------------" << endl; cout << "Imie: " << imie_w << endl; cout << "Nazwisko: " << nazwisko_w << endl; cout << "Wiek: " << wiek_w << endl; cout << "--------------------------------------------" << endl; } int main() { std::string imie[ 2 ]; std::string nazwisko[ 2 ]; int wiek[ 2 ]; for( int i = 0; i < 2; i++ ) wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); for( int i = 0; i < 2; i++ ) wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); return 0; } Funkcja sprawdz tak naprawdę pobierała dane od użytkownika, więc jej nazwa była niewłaściwa. Poza tym funkcje pobierające dane z reguły zwracają tą wartość. Metoda ignore() była wywoływana w niewłaściwym miejscu. Warto zapamiętać: operator >> wczytując dane pozostawia znak nowej linii '\n' w buforze strumienia, na który reaguje funkcja std::getline(); i kończy działanie z pustym stringiem. Trzeba o tym pamiętać mieszając wczytywanie operatorem >> i funkcją std::getline(); . |
|
bobby.hl |
» 2017-02-01 22:46:16 czy w mojej funkcji bool ok mogę zastąpić cin funkcją getline ? Z góry dzięki za odpowiedź! poniżej kod #include <iostream> #include <string>
using namespace std;
bool ok( int & liczba ) { do { cin.clear(); cin.sync(); cin >> liczba; if( liczba == 0 ) cout << "Podaj poprawna wartosc!" << endl; } while( liczba == 0 ); return cin.good(); }
void wczytajOsobe( string & Imie, string & Nazwisko, int & Wiek ) { cout << "Podaj imie" << endl; cin.sync(); getline( cin, Imie ); cout << "Podaj naziwsko" << endl; getline( cin, Nazwisko ); cout << "Podaj wiek" << endl; ok( Wiek ); }
void wypiszOsobe( string Imie, string Nazwisko, int Wiek ) { cout << "Imie: " << Imie << endl; cout << "Naziwksko: " << Nazwisko << endl; cout << "Wiek osoby: " << Wiek << endl; }
int main() { string imie[ 2 ]; string nazwisko[ 2 ]; int wiek[ 2 ]; for( int i = 0; i < 2; i++ ) wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); for( int i = 0; i < 2; i++ ) wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); return 0; } |
|
karambaHZP |
» 2017-02-02 00:18:53 czy w mojej funkcji bool ok mogę zastąpić cin funkcją getline |
? Możesz. Pytanie tylko w jakim celu chcesz utrudniać sobie życie? |
|
bobby.hl |
» 2017-02-02 20:18:17 utrudniać nie chcę, ale chciałbym wiedzieć jak można to zrobić bo zwykłe zastąpienie cin.clear(); cin.sync(); cin >> liczba; funkcją getline( cin, liczba ); niestety nie działa. Karamba jak wywołać getline żeby zastąpiło to co mam? |
|
carlosmay |
» 2017-02-02 20:46:59 Wczytaj do stringa (do tego służy getline) i później konwertuj na.żądany typ liczbowy. Nie wiem czy jest sens takiej pracy. Napisz co chcesz osiągnąć i dlaczego chcesz takiej zmiany. |
|
« 1 » 2 |