Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Usuwanie pustej linii przy cin.ignore()

Ostatnio zmodyfikowano 2016-05-29 15:49
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <cstdlib> //rand(), srand()
#include <ctime> //time()
#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.
P-148665
carlosmay
» 2016-05-29 01:59:44
C/C++
#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.
P-148667
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 ;)
P-148675
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ć.

C/C++
while( !( std::cin >> number ) || number < 1 || number > 1000 ) // operator wczytuje do zmiennej number dane i zostawia w buforze \n
{
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); // tutaj ten \n jest odrzucany (ignorowany)
    std::cout << "Prosze podac liczbe z zakrsu 1-1000: ";
}
P-148677
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!
P-148694
« 1 »
  Strona 1 z 1