Yaoo Temat założony przez niniejszego użytkownika |
Problem z zadaniem domowym z rozdziału o zmiennych tekstowych. » 2015-06-11 21:50:50 #include <iostream> #include <string> using namespace std;
void wczytajOsobe( string imie, string nazwisko, int wiek ) { cout << "Podaj imie: "; do { cin.sync(); cin.clear(); cin >> imie; cin.fail(); } while( cin.fail() ); cout << "Podaj nazwisko: "; do { cin.sync(); cin.clear(); cin >> nazwisko; cin.fail(); } while( cin.fail() ); cout << "Podaj wiek: "; do { cin.sync(); cin.clear(); cin >> wiek; cin.fail(); } while( cin.fail() ); }
void wypiszOsobe( string imie, string nazwisko, int wiek ) { cout << "Twoje imie to: " << imie << "." << endl; cout << "Twoje nazwisko to: " << nazwisko << "." << endl; cout << "Twoj wiek to: " << 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; } Problem się pojawia, gdy próbuję wpisać złe dane (np. jako imię podaję liczbę). Pętla wówczas nie działa i złe dane zostają przyjęte. Potem jednak, gdy przychodzi do wypisania zmiennych na ekran, pojawia się puste miejsce, taka spacja. Proszę o pomoc :/ |
|
Monika90 |
» 2015-06-11 22:29:55 Problem się pojawia, gdy próbuję wpisać złe dane (np. jako imię podaję liczbę). Pętla wówczas nie działa i złe dane zostają przyjęte |
Bo imie to string, do stringa można wczytać dowolny ciąg znaków, więc liczbę, czyli ciąg cyfr, też. Potem jednak, gdy przychodzi do wypisania zmiennych na ekran, pojawia się puste miejsce, taka spacja. |
Parametry funkcji wczytajOsobe powinny być referencjami. |
|
Yaoo Temat założony przez niniejszego użytkownika |
» 2015-06-11 23:11:32 Podaj imie: Jan Podaj nazwisko: Kowalski Podaj wiek: 30 Podaj imie: Jan2 Podaj nazwisko: Kowalski2 Podaj wiek: 31 Twoje imie to: Kowalski. Twoje nazwisko to: . Twoj wiek to: 30. Twoje imie to: Kowalski2. Twoje nazwisko to: . Twoj wiek to: 31.
Process returned 0 (0x0) execution time : 19.484 s Press any key to continue. Nie rozumiem tego, co tu jest źle, że mi się pojawia taki log jak powyżej? Kod źródłowy to: #include <iostream> #include <string> using namespace std;
void wczytajOsobe( string & imie, string & nazwisko, int & wiek ) { cout << "Podaj imie: "; cin >> imie; cout << "Podaj nazwisko: "; cin >> imie; cout << "Podaj wiek: "; do { cin.clear(); cin >> wiek; } while( cin.fail() ); }
void wypiszOsobe( string & imie, string & nazwisko, int & wiek ) { cout << "Twoje imie to: " << imie << "." << endl; cout << "Twoje nazwisko to: " << nazwisko << "." << endl; cout << "Twoj wiek to: " << 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; } |
|
BadBullPL |
» 2015-06-12 05:36:31 Dwa razy wczytujesz do struminia zminną imie |
|
Szymon2727 |
» 2015-06-13 20:59:42 bool czyDobrze; do { std::cout << "Podaj wiek"; std::cin >> wiek; czyDobrze = std::cin.good(); std::cin.clear(); std::cin.sync(); } while( czyDobrze == false );
Pętla powinna działać i na wyrazach. Sam miałem taki problem, a tutaj wystarczy odpowiednio dać metody clear i sync, a jako warunek nie używać bezpośrednio std::cin.fail/good tylko przypisać jakiejś zmiennej tą wartość i wykonać porównanie na niej. |
|
JMII89 |
» 2015-06-14 22:55:04 Poco przypisywać ? Przecież to działa normalnie : do { std::cout << "Podaj wiek : "; std::cin.clear(); std::cin.sync(); std::cin >> wiek; } while( !std::cin.good() );
|
|
Yaoo Temat założony przez niniejszego użytkownika |
» 2015-06-17 17:59:24 Dzięki za pomoc, problem rozwiązany! :) |
|
« 1 » |