( NevemTeve | 2018. 04. 07., szo – 18:06 )

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?