Usuwanie pustej linii przy cin.ignore()
Ostatnio zmodyfikowano 2016-05-29 15:49
Szkaplerny Temat założony przez niniejszego użytkownika |
Usuwanie pustej linii przy cin.ignore() » 2016-05-29 00:44:43 Tytuł może nie za wiele tłumaczy (kompletnie nie mam pojęcia jak to opisać), ale mam taki kod: #include <iostream> #include <cstdlib> #include <ctime> #include <limits> using namespace std;
int main() { srand( time( NULL ) ); int wylosowana_liczba = rand() % 1000; int liczba; do { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "Prosze podac liczbe z zakresu 1-1000: "; cin >> liczba; } while( !cin.good() ||( liczba < 1 || liczba > 1000 ) ); return 0; } Z czym mam problem? Odpalając na samym początku muszę cokolwiek wklepać do konsoli. Printując poszczególne fragmenty dotarłem do tego, że ta 'pusta linia' (do wpisania danych) powstaje właśnie przy funkcji cin.ignore(). Czy można jakoś to rozwiązać? Pojawia się to tylko przy pierwszej iteracji pętli. Jak to wygląda? ***pusta linia, wprowadź tekst i zatwierdź*** Prosze podac liczbe z zakresu 1-1000: 4000 Prosze podac liczbe z zakresu 1-1000: xyz Prosze podac liczbe z zakresu 1-1000: -2 [...] Co już sam zrobiłem? Odwiedziłem dokumentację, 9. lekcję pierwszego etapu kursu i temat o pętlach do{} while. |
|
carlosmay |
» 2016-05-29 01:59:44 #include <random> #include <iostream>
auto main()->int { std::random_device rd; std::mt19937 mtGen( rd() ); std::uniform_int_distribution < int > distance( 1, 1000 ); int randomNuber = distance( mtGen ); int number; std::cout << "Prosze podac liczbe z zakrsu 1-1000: "; while( !( std::cin >> number ) || number < 1 || number > 1000 ) { std::cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); std::cout << "Prosze podac liczbe z zakrsu 1-1000: "; } } Usuwanie pustej linii przy cin.ignore() |
Jeśli bufor strumienia jest pusty metoda ignore() oczekuje na pojawienie się w buforze choćby entera. To tyle. Trzeba zachować odpowiednią kolejność wykonywanych operacji. ps: w tym programie losowana liczba jest nie używana. |
|
Szkaplerny Temat założony przez niniejszego użytkownika |
» 2016-05-29 13:45:33 Tak, liczba nie jest używana, bo jeszcze nie doszedłem do tego etapu. Dzięki za wytłumaczenie, jeśli dalej nie będzie wychodzić posłużę się Twoim przykładem ;) |
|
carlosmay |
» 2016-05-29 13:57:49 jeśli dalej nie będzie wychodzić posłużę się Twoim przykładem ;) |
Ten przykład jest praktyczny. Nie ma co zbytnio kombinować. while( !( std::cin >> number ) || number < 1 || number > 1000 ) { std::cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); std::cout << "Prosze podac liczbe z zakrsu 1-1000: "; }
|
|
Szkaplerny Temat założony przez niniejszego użytkownika |
» 2016-05-29 15:49:21 Przeanalizowałem całą strukturę pętli, prosty sposób. Dzięki jeszcze raz! |
|
« 1 » |