Avatar billede smackers Nybegynder
02. september 2005 - 13:32 Der er 7 kommentarer og
1 løsning

getchar() giver 2 chars??

Når jeg kører nedestående program (forkortet) og indtaster fx [2][enter] vises menuen 2 gange...

Første gang udføres den tilsvarende funktion (fx delBook()) og derefter vises menuen igen som den skal.
Her går det galt. Det lader til at getchar() opfatter mit oprindelige [enter]-tryk som næste karakter og derfor udføres default switch koden som giver en fejlmeddelelse.

Hvad gør jeg får at få getchar() til blot at fange mit [2]-tryk og  ikke og mit [enter]-tryk ???

Et screen dump kan ses under koden.

========= KODE ======================================
#include <stdio.h>
void loadCat() { printf("loadCat");}
void delBook() { printf("delBook");}   
void saveCat() { printf("saveCat");}   
void sortCat() { printf("sortCat");}   

int main()
{
    char main_choice;
   
    do {
        //display main menu
        printf("\n\n1. Load catalogue from file\n");
        printf("2. Delete book from catalogue\n");
        printf("3. Save catalogue to file\n");
        printf("4. Sort and display catalogue\n");
        printf("5. Quit\n");
        printf("\n >> ");
       
        main_choice = getchar();
        printf("\n%d", main_choice);
        printf("\n%d\n", main_choice);
       
        switch (main_choice) {
            case '1': loadCat(); break;
            case '2': delBook(); break;
            case '3': saveCat(); break;
            case '4': sortCat(); break;
            case '5': break;
            default:
                printf("Invalid choice! Valid inputs are: [1,2,3,4,5]");
                break;
        }

    }while (main_choice != '5');

    return 0;
   
}

========= SCREEN DUMP ======================================

33> bookcat

1. Load catalogue from file
2. Delete book from catalogue
3. Save catalogue to file
4. Sort and display catalogue
5. Quit

>> 2
delBook

1. Load catalogue from file
2. Delete book from catalogue
3. Save catalogue to file
4. Sort and display catalogue
5. Quit

>> Invalid choice! Valid inputs are: [1,2,3,4,5]

1. Load catalogue from file
2. Delete book from catalogue
3. Save catalogue to file
4. Sort and display catalogue
5. Quit

>>
Avatar billede smackers Nybegynder
02. september 2005 - 13:40 #1
Er der forresten en metode (i C) til at indlæse et tastetryk uden brugeren behøver trykke [enter] efter indtastet valg??

Alle mine menuer håndteres med tallene 1-9, så jeg behøver ikke vente på at brugeren trykker [5][enter] for at udføre tilhørende menufunktion..
Avatar billede arne_v Ekspert
02. september 2005 - 13:54 #2
ANSI C har ikke en funktion som ikke kræver retur

men i mange compilere kan man inkludere conio.h og bruge getch funktionen
Avatar billede arne_v Ekspert
02. september 2005 - 13:55 #3
du skal vel ind og teste på om du har indlæst en '\r' eller '\n'
Avatar billede smackers Nybegynder
02. september 2005 - 16:00 #4
forresten: gcc version 3.4.2 (mingw-special)
Avatar billede arne_v Ekspert
02. september 2005 - 18:21 #5
gcc/mingw har conio.h og getch
Avatar billede smackers Nybegynder
03. september 2005 - 03:43 #6
> arne_v: gcc/mingw har conio.h og getch
Du har ganske ret! Jeg burde have skrevet: jeg må kun bruge stdio.h og stdlib.h!

Men du viste mig vejen!

Her er min løsning:

char getChoice()
{
    char c, tmp;
    c = getchar();
   
    // flush inputstream
        // * fflush(stdin) er undefined!! (men virker i windows...pft)
    do {
        tmp = getchar();
    }while (tmp != '\n');
    return c;
}

og i main():

main_choice = getChoice();
Avatar billede smackers Nybegynder
03. september 2005 - 04:17 #7
tak for kickstarteren arne_v!

giv et svar og modtag point :)

mvh smackers
Avatar billede arne_v Ekspert
03. september 2005 - 09:58 #8
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester