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