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.
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.