Szerintem itt két dolgot kellene felismerni; az egyik az, hogy a topiknyitó olvtárs azóta már a prog.hu-n is túl jár, a másik az, hogy a felhasználói input feldolgozása hálátlan, érdektelen, de nem könnyű munka. Most hirtelen két rutin elkészítését javasolnám, az egyik általános string-beolvasás, a másik pedig szám-beolvasás, ez az előzőn alapulna.
Ilyesmi lehetne a kiindulás:
static int getint_range (const char *prompt, int mini, int maxi)
{
int ok= 0;
int n;
for (ok= 0; !ok; ) {
n= getint (prompt);
if (n>=mini && n<=maxi) {
ok= 1;
} else {
printf ("Hibas szam, %d es %d kozott kellene\n", mini, maxi);
}
}
return n;
}
static int getint (const char *prompt)
{
int ok= 0;
long l;
char numbuff [12];
char *endptr;
for (ok= 0; !ok; ) {
getstr (prompt, numbuff, sizeof numbuff);
l= strtol (numbuff, &endptr, 10);
if (*endptr==0 && (long)((int)l) == l) {
ok= 1;
} else {
printf ("Hibas szam '%s'\n", numbuff);
}
}
return (int)l;
}
static void getstr (const char *prompt, char *buff, size_t buflen)
{
char tmp[256], *p;
size_t len;
int ok;
for (ok=0; !ok; ) {
fputs (prompt, stdout);
fflush (stdout);
p= fgets (tmp, sizeof tmp, stdin);
if (p==NULL) {
printf ("Nem megy a stdin olvasasa\n");
exit (1);
}
len= strlen (tmp);
if (len==0 || tmp[len-1]!='\n') {
printf ("Tul hosszu vagy hibas input\n");
continue;
}
tmp[--len]= '\0';
if (len>0 && tmp[len-1]=='\r') tmp[--len]= '\0';
if (len==0) {
printf ("Ures input? Probald ujra\n");
continue;
}
if (len+1>buflen) {
printf ("Tul hosszu input\n");
continue;
}
strcpy (buff, tmp);
ok= 1;
}
}
Szerk: hoppá, három lett, maradhat?