Het inlezen van een C-string met scanf of fscanf inclusief spaties.

© Harry Broeders.

Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft.

Bij het inlezen van de karakter array

    char naam[21];

met

    scanf("%20", naam);

wordt alleen het eerste woord (maximaal 20 karakters) ingelezen. Soms wil je in een karakter array ook spaties inlezen. In plaats van %s te gebruiken kun je bij het gebruik van scanf ook precies opgeven welke karakters als geldige invoer geaccepteerd worden. Met

    scanf("%20[A-Za-z ]", naam);

worden alle letters (hoofd en kleine letters) en spaties die worden ingetyped in de karakter array naam opgeslagen. De invoer stopt als iets anders dan een letter of spatie wordt ingevoerd of als er 20 geldige karakters zijn ingevoerd.

Als je bijvoorbeeld een C-string van maximaal 21 karakters wilt inlezen die kan bestaan uit letters, cijfers, punten, komma's, vraagtekens, dubbele punten, punt komma's, ronde haakjes, min tekens of spaties dan kan dit als volgt:

    scanf("%20[A-Za-z0-9.,?:;()\- ]", naam);

Merk op dat het minteken als \- moet worden opgegeven omdat het anders de speciale betekenis "tot en met" heeft (zoals bij A-Z).

Het onderstaande programma laat zien hoe je op deze manier strings kunt inlezen. Meer informatie kun je vinden op: http://en.cppreference.com/w/c/io/fscanf en http://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html.

De functie aanroep

    fflush(stdin);

zorgt ervoor dat alle karakters die nog in het invoerbuffer staan worden weggespoeld.

Voorbeeld:

In het volgende voorbeeldprogramma demosp.c worden de gegevens van een aantal personeelsleden ingelezen en afgedrukt.

#include <stdio.h>

int main(void) {
    int aantal = 0;
    int teller;

    struct {
        char naam[21];
        char adres[26];
        int leeftijd;
        int salaris;
    } rij[20];

    /* Invoer */
    do {
        printf("Hoeveel personen wilt u invoeren? (max 20) ");
        fflush(stdin);
    }
    while (scanf("%d", &aantal) != 1 || aantal < 1 || aantal > 20);

    for (teller = 0; teller < aantal; ++teller) {
        do {
            printf("Invoer persoon %d    Naam    : ", teller);
            fflush(stdin);
        } while (scanf("%20[A-Za-z.@+()\- ]", rij[teller].naam) != 1);
        do {
            printf("                    Adres   : ");
            fflush(stdin);
        } while (scanf("%25[A-Za-z0-9.,?:/()\- ]", rij[teller].adres) != 1);
        do {
            printf("                    Leeftijd: ");
            fflush(stdin);
        } while (scanf("%d", &rij[teller].leeftijd) != 1);
        do {
            printf("                    Salaris : ");
            fflush(stdin);
        } while (scanf("%d", &rij[teller].salaris) != 1);
    }

    /* Uitvoer */
    printf("\n");
    printf("%2s | %-20s | %-25s | %5s | %8s\n", "Nr", "Naam", "Adres", "Lft", "Sal");
    for (teller = 0; teller < aantal; ++teller) {
        printf(
            "%02d | %-20s | %-25s | %5d | %8d\n",
            teller,
            rij[teller].naam,
            rij[teller].adres,
            rij[teller].leeftijd,
            rij[teller].salaris
        );
    }
    fflush(stdin);
    getchar();
    return 0;
}

Uitvoer van dit programma:

De ingetypte invoer is geel weergegeven.