Hoe voorkom ik dat het uitvoer van mijn programma meteen verdwijnt?

© Harry Broeders.

Deze pagina is bestemd voor studenten van de Haagse Hogeschool - TH Rijswijk/Academie voor Engineering.

Hoe voorkom ik dat het uitvoer van mijn programma meteen verdwijnt?

Als je in wxDev-C++ een C programma schrijft dat uitvoer produceerd dan wordt het window waarin deze uitvoer verschijnt meteen weer gesloten. Dat is natuurlijk niet zo handig! Probeer het volgende programma maar eens te compileren en uit te voeren met wxDev-C++.

#include <stdio.h>

int main() {
    printf("FLITS!\n");
    return 0;
}

Als je dit programma uitvoert dan verdwijnt de uitvoer meteen. In het boek "De taal C van PSD tot C programma" van Daryl McAllister wordt dit opgelost door, voordat de functie main wordt afgesloten (door return 0;), de functie getch() aan te roepen.

#include <stdio.h>
#include <conio.h>

int main() {
    printf("FLITS!\n");
    printf("Druk op een willekeurige toets om dit window te sluiten.");
    getch();
    return 0;
}

De functie getch wacht totdat er een willekeurig karakter wordt ingetoetst en leest dit karakter in. Het nadeel van deze oplossing is dat de functie niet is opgenomen in de standaard C library maar in de conio library. Dat wil dus zeggen dat dit programma misschien niet meer werkt als we een andere C compiler gebruiken. Het is daarom beter om de standaard C functie getchar() aan te roepen.

#include <stdio.h>

int main() {
    printf("FLITS!\n");
    printf("Druk op de Enter toets om dit window te sluiten.");
    getchar();
    return 0;
}

De functie getchar leest, net zoals getch, een karakter in. Deze functie start echter pas met inlezen als de gebruiker een hele regel heeft ingevoerd. Daarom moet je in dit geval op de Enter toets drukken om het uitvoerwindow te sluiten.

Ik gebruik getch of getchar en toch verdwijnt mijn uitvoerwindow te snel. Hoe kan dat?

Als je programma niet alleen uitvoer produceert maar ook data inleest dan is het gebruik van één aanroep van getchar() of getch() niet meer voldoende! Probeer maar:

#include <stdio.h>

int main() {
    int getal;
    printf("Geef een geheel getal: ");
    scanf("%d", &getal);
    printf("Het getal is %d.\n", getal);
    printf("Druk op de Enter toets om dit window te sluiten.");
    getchar();
    return 0;
}

Nu sluit het window meteen nadat je het getal hebt ingetypt!

De functie scanf die het getal inleest begint pas met inlezen nadat de gebruiker op Enter heeft gedrukt. Het enter karakter zelf wordt door de functie scanf echter niet ingelezen. De functie getchar leest dus dit enter karakter meteen in en wacht niet op verdere invoer. Er zijn verschillende oplossingen voor dit probleem:

Oplossing 1:

Gebruik een extra aanroep getchar()om het enter karakter dat de functie scanf nog niet heeft ingelezen alsnog in te lezen.

#include <stdio.h>

int main() {
    int getal;
    printf("Geef een geheel getal: ");
    scanf("%d", &getal);
    printf("Het getal is %d.\n", getal);
    printf("Druk op de Enter toets om dit window te sluiten.");
    getchar();
    getchar();
    return 0;
}

Oplossing 2:

Gebruik de functie fflush om alle invoer die nog niet is ingelezen weg te gooien voordat je getchar()aanroept.

#include <stdio.h>

int main() {
    int getal;
    printf("Geef een geheel getal: ");
    scanf("%d", &getal);
    printf("Het getal is %d.\n", getal);
    printf("Druk op de Enter toets om dit window te sluiten.");
    fflush(stdin);
    getchar();
    return 0;
}

Oplossing 3:

Vertel de functie scanf dat de enter na het getal ook ingelezen moet worden

#include <stdio.h>

int main() {
    int getal;
    char afval;
    printf("Geef een geheel getal: ");
    scanf("%d%c", &getal, &afval);
    printf("Het getal is %d.\n", getal);
    printf("Druk op de Enter toets om dit window te sluiten.");
    getchar();
    return 0;
}

Welke van deze 3 oplossingen is de beste?

Probeer maar eens in plaats van een getal gevolgd door een enter, een getal, dan een spatie en dan pas een enter in te voeren. Oplossing 2 is de enige oplossing die dan nog correct werkt! Oplossing 2 is dus de beste oplossing.