Dodatno vrednovanje podataka
Razmotrimo slijedeći program
#include <stdio.h> main() { int number;
printf("Unesite broj\n"); scanf("%d", &number ); printf("Uneseni broj je %d\n", number ); }Program iznad ima nekoliko problema
U ovom trenutku mi ćemo željeti istražiti i neke druge aspekte, kao što su
Kada provjeravamo podatke pri samom unosu, te
osiguramo da je točan tip podataka i njihov opseg, spriječavamo da se krivi
podaci šalju dalje. Ovo čini kod koji obrađuje podatke jednostavnijim
za pisanje i na taj način se smanjuje pogreška.
Primjer
Pogledajmo slučaj kada upravljamo unosom podataka.
Dakle, znamo da su korisnici programa skupina gnjavatora koji troše većinu
svog vremena otkrivajući nove i sve ljepše načine da sruše naše programe.
Pokušajmo napisati kod za svrhu općenitog unosa podataka, kao zamjena za funkciju scanf(). Napisat ćemo funkciju koja će čitati unesene podatke kao niz karaktera.
Funkcija je readinput(), koja ,da bi bila što općenitija, prima nekoliko parametara,
/* version 1.0 */ #include <stdio.h> #include <ctype.h> #define MAX 80 /* maksimalna dužina bafera */ #define DIGIT 1 /* podaci se čitaju kao znamenke 0-9 */ #define ALPHA 2 /* podaci se čitaju kao slova A-Z */ #define STRING 3 /* podaci se čitaju kao ASCII */ void readinput( char buff[], int mode, int limit ) { int ch, index = 0; ch = getchar(); while( (ch != '\n') && (index < limit) ) { switch( mode ) { case DIGIT: if( isdigit( ch ) ) { buff[index] = ch; index++; } break; case ALPHA: if( isalpha( ch ) ) { buff[index] = ch; index++; } break; case STRING: if( isascii( ch ) ) { buff[index] = ch; index++; } break; default: /* ovo se ne bi trebalo dogoditi */ break; } ch = getchar(); } buff[index] = 0x00; } main() { char buffer[MAX]; int number; printf("Unesite integer broj\n"); readinput( buffer, DIGIT, MAX ); number = atoi( buffer ); printf("Uneseni broj je %d\n", number ); }Naravno, program se može još poboljšati. Možemo promijeniti readinput tako da vraća integer vrijednost koja predstavlja broj učitanih karaktera. Ovo će pomoći pri određivanju da li je podatak uopće unesen. U programu iznad nije jasno da li je korisnik unio neki podatak ( mogli smo provjeriti da li je buffer bio prazan).
Napravimo sada izmjene i pogledajmo kako izgleda modificirani program.
/* version 1.1 */ #include <stdio.h> #include <ctype.h> #define MAX 80 /* maksimalna dužina bafera */ #define DIGIT 1 /* podaci se čitaju kao znamenke 0-9 */ #define ALPHA 2 /* podaci se čitaju kao slova A-Z */ #define STRING 3 /* podaci se čitaju kao ASCII */
int readinput( char buff[], int mode, int limit ) { int ch, index = 0; ch = getchar(); while( (ch != '\n') && (index < limit) ) { switch( mode ) { case DIGIT: if( isdigit( ch ) ) { buff[index] = ch; index++; } break; case ALPHA: if( isalpha( ch ) ) { buff[index] = ch; index++; } break; case STRING: if( isascii( ch ) ) { buff[index] = ch; index++; } break; default: /* ovo se ne bi trebalo dogoditi */ break; } ch = getchar(); } buff[index] = 0x00; return index; } main() { char buffer[MAX]; int number, digits = 0; while( digits == 0 ) { printf("Unesite integer broj\n"); digits = readinput( buffer, DIGIT, MAX ); if( digits != 0 ) { number = atoi( buffer ); printf("Uneseni broj je %d\n", number ); } } }Druga verzija je mnogo bolje napisana.
Drugi primjeri vrednovanja
unosa