Avatar billede onkel_satan Nybegynder
21. oktober 2004 - 11:55 Der er 4 kommentarer og
1 løsning

funktion viker for sig selv men ikke i en menu ?

Er løbet ind i et lidt mærkeligt problem.
Jeg har lavet en linkede list hvortil jeg har en masse funktioner som gør et eller andet ved listen (sortere, tilføjer, sletter, udskriver etc.).
Efter hånden som jeg fik de forskellige funktioner lavet færdigt avprøvet jeg dem hver for sig. Nu når det hele så er færdigt skal jeg have det hele smækket ind i en menu hvor man så kan udføre det forskellige funktioner. Menu'en er bare lavet med en switch().
Nu er det så at det mærkelige kommer. Min add() funktion virker ikke længere efter jeg har smidt den ind i switch menu'en.
Et element i listen har følgende data: name, grade, next
Normalt vil add funktionen spørger efter navn og vente til der bliver indtastet, hvorefter at den så spørger efter grade.
Men efter jeg har smidt den ind i menu'en udskriver den både "Enter name: " og "Enter grade: " Hvis jeg så indtaster et navn løber den hele menu'en igennem engang til hvor så den igen udskriver "Enter name: " "Enter grade: " og så kan jeg saa indtaste grade.
Som sagt hvis jeg skipper menu'en og køre funktionen for sig selv virker den helt fint.
gets() burde vente på at der kommer et input men det ser ikke saadan ud eftersom den udskriver "Enter grade" førend jeg har indtastet noget som helst.
add funktionen ser saa ledes ud:

void add(nod** head){
    int i=0;
    char stringBuffer[50];
    nod* newNod=(nod*)malloc(1*sizeof(nod));
    printf("Enter name:\n");
    gets(stringBuffer);
    newNod->name = (char*)malloc(strlen(stringBuffer));
    while(newNod->name[i] = stringBuffer[i])i++;
    printf("Enter grade:\n");
    scanf("%d", &newNod->grade);
    newNod->next = *head;
    *head = newNod;
}

Nogen der ved hvad der går galt ?
Avatar billede sovsekoder Nybegynder
21. oktober 2004 - 12:18 #1
hvordan ser din menu ud der kalder add ?
Avatar billede onkel_satan Nybegynder
21. oktober 2004 - 12:28 #2
while(c){
        printf("Choose a number:\n");
        printf("1) Show grade list\n");
        printf("2) Show grade list in reverse order\n");
        printf("3) Order list in increasing order of the grades\n");
        printf("4) Add new grade\n");
        printf("5) Show average of all grades\n");
        printf("6) Show grade histogram\n");
        printf("7) Shuffle grade list\n");
        printf("8) Alphabetically order grade list using std. quicksort\n");
        printf("9) Alphabetically order grade list using my quicksort\n");
        printf("0) Quit\n");
        scanf("%d", &c);
        switch(c){
            case 1:
                disp(head);
                break;
            case 2:
                reversDisp(head);
                break;
            case 3:
                sortGrade(&head);
                disp(head);
                break;
            case 4:
                add(&head);
                disp(head);
                break;
            case 5:
                average(head);
                break;
            case 6:
                histogram(head);
                break;
            case 7:
                shuffle(&head);
                disp(head);
                break;
            case 8:
                if(c == 8){
                    int amount = count(head);
                    nod** a = listToArray(head);
                    qsort((void*)a, amount, sizeof(a[0]), myCompare);
                    arrayToList(a, &head);
                    disp(head);
                }           
                break;
            case 9:
                qsortLinked(&head);
                disp(head);
                break;
        }   
    }
Avatar billede onkel_satan Nybegynder
22. oktober 2004 - 17:31 #3
Fandt selv ud af det.
Løse problemet ved at flushe input bufferen inden gets() kaldes.
Avatar billede bertelbrander Novice
22. oktober 2004 - 21:36 #4
Jeg gentager lige, fra C-standarden:

"int fflush(FILE *stream);
Description: If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined."

undefined betyder at alt kan ske, lige fra at den gør det du synes at den skal, over ingenting, til at den formaterer din HD (ikke sansynligt, men standarden sætter ikke begrænsniger på undefined).

Det er muligt at det virker på en kompiler men ikke på en anden.
Avatar billede segmose Nybegynder
28. oktober 2004 - 14:45 #5
Det var vist ikke godt jeg fik skrevet det i sin tid :(

Men noget helt andet er at du ikke må bruge gets, brug fgets på stdin istedet ellers laver du en bufferoverrun hul, overvej hvad der sker hvis du skriver 54 tegn ind med gets.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis