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ść
malan
» 2011-03-21 23:52:08
Możesz ewentualnie spróbować napisać własną wersję funkcji getch pod Linuxa. Ja znalazłem np. coś takiego:
http://debian.linux.pl/threads/16081-Funkcja-getch%28%29-w-C
C/C++
int mygetch()
{
    struct termios oldt,
    newt;
    int ch;
    tcgetattr( STDIN_FILENO, & oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, & newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, & oldt );
    return ch;
}
Nie mam Linuxa, więc nie powiem Ci, czy ten kod działa ;p.
Aczkolwiek, jeśli ten kod spełniałby Twoje oczekiwania mógłbyś to zrobić tak:
C/C++
#include <iostream>

char choice();
void menu();
int myGetch();

int main()
{
    bool exit = false;
    int option = 0;
   
    while( !exit )
    {
        menu();
       
        option = choice();
        switch( option )
        {
        case '1': std::cout << "Option 1" << std::endl; break;
        case '2': std::cout << "Option 2" << std::endl; break;
        case '3':
            std::cout << "Exit" << std::endl;
            exit = true;
            break;
        }
    }
}

void menu()
{
    std::cout << "[1] Option 1" << std::endl;
    std::cout << "[2] Option 2" << std::endl;
    std::cout << "[3] Exit" << std::endl;
}

char choice()
{
    bool choiceIsGood = false;
    char c = 0;
   
   
    while( !choiceIsGood )
    {
        c = myGetch();
        choiceIsGood =( c >= '1' && c <= '3' );
    }
   
    return c;
}

int myGetch()
{
    //Tutaj implementacja getch...
}
P-29578
dmx81
» 2011-03-22 07:27:49
nie wiem,czy ktos juz wspomnial ani jak to do konca dziala, ale zawsze jak czytam o conio.h, to czesto ludzie podaja odpowiednik na linuxa gconio.h, ponoc dziala jak nalezy
P-29579
freoone
Temat założony przez niniejszego użytkownika
» 2011-03-22 14:51:57
Dzięki malan.
Twój kod działa, tylko muszę dołączyć do niego biblioteki curses.h, termios.h i unistd.h.
Program działa tak, że w menu wyboru zaraz po naciśnięciu klawisza włącza się odpowiednia opcja. Gdy nacisnę klawisz inny niż zostało to przewidziane, po prostu nic się nie dzieje. Ilość opcji jest więc ograniczona ilością klawiszy, ale na takie proste programy to wystarczy.
Niestety nie mogę tego zastosować w momencie, w którym trzeba wpisać rozmiar tablicy. Gdy używam tam cin.ignore() znów trzeba nacisnąć enter, zanim program wczyta wartość. Tym razem jednak enter trzeba naciskać za każdym razem, gdy uruchamiana jest funkcja "wybor2".
Paradoksalnie w pierwszym programie wystarczyło tylko raz nacisnąć enter przy wyborze opcji, później już program w każdej funkcji wczytywał zmienną od razu.
P-29580
malan
» 2011-03-22 17:07:03
Testowałeś w ogóle ten program? Próbowałeś tworzyć tablice? Moim zdaniem, to ten program powinien się wywalić z wielkim hukiem... ;p Tworzysz tablicę o liczbie elementów równą zero (
int tablica[ 0 ]
), a potem bezczelnie jeszcze odwołujesz się do nieistniejących elementów sądząc, że w ten sposób zmieniłeś rozmiar tablicy ;p. To nie takie proste jak Ci się wydaje ;)
P-29583
freoone
Temat założony przez niniejszego użytkownika
» 2011-03-22 17:15:34
Program testowałem i u mnie działa bez zarzutu (oprócz tego nieszczęsnego entera) :)

//Dodane

Poprawka. Jeżeli w tablicy znajduje się więcej niż 4 elementy, to przy wychodzeniu z programu wyświetla się napis "segmentation fault".

//Dodane

Zmieniłem program tak, że na początku tworzy tablicę o 100 elementach. Użytkownik wybiera tylko ile z tych stu ma być wykorzystane.
Rozumiem, że nie da się napisać programu, który tworzyłby tablicę o różnej ilości elementów, ponieważ system przy uruchomieniu programu musi wiedzieć ile pamięci mu przydzielić, tak?
P-29585
DejaVu
» 2011-03-22 17:58:54
Da się, ale to jest dynamiczne zarządzanie pamięcią. Można też do tego celu wykorzystać kontener » standard C++vector, jednak polecam najpierw nauczyć się dynamicznego zarządzania pamięcią, a dopiero później korzystać z takich dobrodziejstw jak kontenery C++.
P-29587
freoone
Temat założony przez niniejszego użytkownika
» 2011-03-22 19:53:46
Istnieją jakieś metody, żeby nie naciskać entera? Może jakoś "sztucznie" go wcisnąć, tak żeby użytkownik już nie musiał.
P-29589
malan
» 2011-03-22 19:56:37
Cały czas Ci chodzi o wprowadzanie rozmiaru tablicy? Na moje to w enterze w tym miejscu nie ma nic złego...
P-29590
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona