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

Problem z "cin.ignore()"

Ostatnio zmodyfikowano 2011-03-23 00:35
Autor Wiadomość
freoone
Temat założony przez niniejszego użytkownika
Problem z "cin.ignore()"
» 2011-03-21 21:20:50
Witam.
Od niedawna uczę się programować w c++ i mam następujący problem.
Stworzyłem prosty program, którego zadaniem jest utworzenie tablicy składającej się z zadanej przez użytkownika ilości elementów lub wyświetleniem wszystkich elementów utworzonej tablicy. Program działa, ale jest jedno ale. Na samym początku po uruchomieniu, gdy program prosi o wybranie opcji, muszę nacisnąć enter i dopiero później wybrać opcję. Trzeba to zrobić tylko raz przy starcie. Wiem, że jest to spowodowane metodą cin.ignore().
Czy istnieje jakiś inny sposób czyszczenia strumienia wejściowego, lub przynajmniej jakiś trick, który pozwoliłby ominąć naciskanie tego entera. Wiem, że problem jest błahy i praktycznie nic nie zmienia w programie, jednak chciałbym się tego pozbyć. Nie mogę zamiast cin.ignore() napisać cin.sync(), ponieważ używam linuksa.
Oto kod programu:
C/C++
#include <iostream>
#include <cstdlib>

void menu()
{
    std::cout << "Co chcesz zrobić?" << std::endl;
    std::cout << "[1] Utwórz tablicę" << std::endl;
    std::cout << "[2] Odczytaj tablicę" << std::endl;
    std::cout << "[0] Wyście" << std::endl;
}

int wybor()
{
    int a;
    do
    {
        std::cin.clear();
        std::cin.ignore( 1000, '\n' );
        std::cin >> a;
        if( std::cin.fail() ) std::cout << "Błąd! Wprowadzono złą wartość!" << std::endl;
       
    } while( std::cin.fail() || a < 0 || a > 2 );
   
    return a;
}

int wybor2()
{
    int a;
    do
    {
        std::cin.clear();
        std::cin.ignore( 1000, '\n' );
        std::cin >> a;
        if( std::cin.fail() ) std::cout << "Błąd! Wprowadzono złą wartość!" << std::endl;
       
    } while( std::cin.fail() );
   
    return a;
}

void wyswietl( int tablica[], int roz )
{
    int i = 0;
    do
    {
        std::cout << "Miejsce " << i << " to " << tablica[ i ] << std::endl;
        i++;
    } while( i < roz );
   
}

int utworz( int tablica[], int roz )
{
    int i = 0;
    do
    {
        std::cout << "> ";
        tablica[ i ] = wybor2();
        i++;
    } while( i < roz );
   
    return tablica[ roz ];
}

int main()
{
    int a = 0;
    int roz = 0;
    int wyb = 0;
    int tablica[ 0 ];
    do
    {
        menu();
        wyb = wybor();
        if( wyb == 1 )
        {
            std::cout << "Jaki rozmiar?" << std::endl;
            roz = wybor2();
            tablica[ roz ];
            utworz( tablica, roz );
            a = 1;
        }
        if( wyb == 2 && a == 1 ) wyswietl( tablica, roz );
       
        if( wyb == 2 && a != 1 ) std::cout << "Błąd. Nie znaleziono tablicy!" << std::endl;
       
    } while( wyb != 0 );
   
}
P-29555
MrOsamaful
» 2011-03-21 21:24:21
getche() z conio.h ???
P-29556
freoone
Temat założony przez niniejszego użytkownika
» 2011-03-21 21:37:28
Niestety w linuksie nie ma conio.h.

//Dodane

W bibliotece <curses.h> znajduję się getchar().
Zastąpiłem nim cin.ignore(). Nie trzeba już naciskać enter, ale wpisując znaki inne niż cyfry napis "Błąd" pojawia się tyle razy ile było znaków.

C/C++
...
int wybor()
{
    int a;
    do
    {
        std::cin.clear();
        //std::cin.ignore(1000, '\n');
        getchar();
        std::cin >> a;
        if( std::cin.fail() ) std::cout << "Błąd! Wprowadzono złą wartość!" << std::endl;
       
    } while( std::cin.fail() || a < 0 || a > 2 );
   
    return a;
}
...
P-29563
szyx_yankez
» 2011-03-21 21:48:32
getchar() jest też w <cstdio>.

P-29565
freoone
Temat założony przez niniejszego użytkownika
» 2011-03-21 21:56:42
To samo co w przypadku biblioteki curses.h
P-29568
szyx_yankez
» 2011-03-21 21:58:24
ale wpisując znaki inne niż cyfry napis "Błąd" pojawia się tyle razy ile było znaków.
Zmien typ zmiennej 'a' z
int
 na
char
.
P-29570
freoone
Temat założony przez niniejszego użytkownika
» 2011-03-21 22:17:33
W funkcji "wybor" zmieniłem zmienną 'a' na char, a w funkcji main zmienną 'wyb' również na char. Niestety odpalając program trzeba wcisnąć enter, żeby później dało się wybrać opcję, a wpisując wiele znaków, "menu" pojawia się wiele razy, w zależności od ilości znaków.
P-29573
DejaVu
» 2011-03-21 23:05:20
Do swojej pierwotnej wersji programu wpisz zamiast ignore coś takiego:
C/C++
fflush( stdin );

/edit:
Dołącz również plik nagłówkowy:
C/C++
#include <cstdio>

/edit2:
http://cpp0x.pl/kursy/Kurs-C++/Podstawy /Obsluga-strumienia-wejsciowego/12
Pod linuksem ponoć też nie działa... poprawiłem sekcję rozdziału poświęconą problemom z linuksem i sposobem używania cin.ignore.
P-29574
« 1 » 2 3
  Strona 1 z 3 Następna strona