Rukovanje unosom podataka u C-u
scanf() ima
problema kada se od korisnika očekuje da unese integer, a on umjesto toga
unese string i tada se program sruši. Ovo se može spriječiti na način da
se svi podaci koji se unose čitaju kao string (upotrebom getchar()),
i onda konvertiraju u ispravan tip podataka.
/* prvi primjer, čita tekst linije */ #include <stdio.h> #include <ctype.h> #define MAXBUFFERSIZE 80 void cleartoendofline( void ); /* ANSI prototip funkcije */ void cleartoendofline( void ) { char ch; ch = getchar(); while( ch != '\n' ) ch = getchar(); } main() { char ch; /* uneseni podatak */ char buffer[MAXBUFFERSIZE]; /* dovoljna veličina za čitavu liniju */ int char_count; /* broj učitanih karaktera po liniji */ int exit_flag = 0; int valid_choice; while( exit_flag == 0 ) { printf("Unesite tekst linije (<80 char znakova)\n"); ch = getchar(); char_count = 0; while( (ch != '\n') && (char_count < MAXBUFFERSIZE)) { buffer[char_count++] = ch; ch = getchar(); } buffer[char_count] = 0x00; /* oznaka kraja niza */ printf("\nUnesena linija je:\n"); printf("%s\n", buffer); valid_choice = 0; while( valid_choice == 0 ) { printf("Nastaviti (D/N)?\n"); scanf(" %c", &ch ); ch = toupper( ch ); if((ch == 'D') || (ch == 'N') ) valid_choice = 1; else printf("\007Pogreška: pogrešan unos\n"); cleartoendofline(); } if( ch == 'N' ) exit_flag = 1; } }
Primjer, koji čita broj kao string
/* drugi primjer, čita brojeve kao string */ #include <stdio.h> #include <ctype.h> #include <stdlib.h> #define MAXBUFFERSIZE 80 void cleartoendofline( void ); /* ANSI prototip funkcije */ void cleartoendofline( void ) { char ch; ch = getchar(); while( ch != '\n' ) ch = getchar(); } main() {
char ch; /* uneseni podatak */ char buffer[MAXBUFFERSIZE]; /* dovoljna veličina za čitavu liniju */ int char_count; /* broj učitanih karaktera po liniji */ int exit_flag = 0, number, valid_choice;
while( exit_flag == 0 ) { valid_choice = 0; while( valid_choice == 0 ) { printf("Unesite broj između 1 i 1000\n"); ch = getchar(); char_count = 0; while( (ch != '\n') && (char_count < MAXBUFFERSIZE)) { buffer[char_count++] = ch; ch = getchar(); } buffer[char_count] = 0x00; /* oznaka kraja niza */ number = atoi( buffer ); if( (number < 1) || (number > 1000) ) printf("\007Pogreška. Broj je izvan opsega 1-1000\n"); else valid_choice = 1; } printf("\nBroj koji ste unijeli je:\n"); printf("%d\n", number); valid_choice = 0; while( valid_choice == 0 ) { printf("Nastaviti (D/N)?\n"); scanf(" %c", &ch ); ch = toupper( ch ); if((ch == 'D') || (ch == 'N') ) valid_choice = 1; else printf("\007Pogreška: pogrešan unos\n"); cleartoendofline(); } if( ch == 'N' ) exit_flag = 1; } }Drugi primjeri