M'accorgo d'essermi spiegato in modo pessimo. Ci riprovo.
Lumo:
"Che io sappia atoi() scarta tutto quello che non c'entra dopo i caratteri numerici, quindi non serve nemmeno eliminare il newline".
E' vero che atoi() scarta tutto quel che non c'entra dopo i caratteri numerici, però se i caratteri numerici a inizio stringa non ci sono proprio, atoi() accetta comunque la stringa e restituisce 0, ovvero la stessa cosa che restituirebbe se uno le avesse passato "0M'accorgo d'essermi spiegato in modo pessimo. Ci riprovo.
Lumo:
"Che io sappia atoi() scarta tutto quello che non c'entra dopo i caratteri numerici, quindi non serve nemmeno eliminare il newline".
E' vero che atoi() scarta tutto quel che non c'entra dopo i caratteri numerici, però se i caratteri numerici a inizio stringa non ci sono proprio, atoi() accetta comunque la stringa e restituisce 0, ovvero la stessa cosa che restituirebbe se uno le avesse passato "0{parsed_message}" o "0\n{parsed_message}". Dato che il valore 0 è quello che attiva l'uscita dal menu', e dato che volevo fare in modo che
non si potesse lasciare il menu' senza un'immissione valida, questo comportamento è inaccettabile.
Il valore di ritorno di atoi() è 0 anche se le si passa una stringa che contiene solo "\n", ovvero se si preme return senza avere immesso alcunché. Anche questo è un comportamento che non è coerente con quel che volevo ottenere.
Dunque, volevo che l'immissione fosse
con certezza e intenzionalmente costituita da sole cifre 0-9 (ovvero un numero intero positivo), per cui mi serviva una funzione che verificasse tale condizione. Per questo ho preparato la funzione Numero(). Però Numero() segnala come numero non valido una stringa che contenga
qualsiasi carattere che non sia una cifra 0-9, quindi avrebbe segnalato come non valida anche una stringa come "2\n{parsed_message}". Per questo ho dovuto accertarmi che l'ultimo carattere della stringa non fosse '\n' e, per pura paranoia, ho anche voluto accertarmi, con if(l!=0), che la stringa contenesse effettivamente dei caratteri.
Alla fine della fiera, dunque, non dovrebbe essere possibile lasciare il menù in altro modo che immettendo un numero compreso tra 0 e il valore del parametro nVoci, perché viene richiesta a oltranza una nuova immissione fintanto che "scelta < 0 || scelta >= nVoci".
P.S. - Non solo ho "snobbato" strlen() da string.h, ho "snobbato" pure isdigit() da ctype.h!
" o "0\nM'accorgo d'essermi spiegato in modo pessimo. Ci riprovo.
Lumo:
"Che io sappia atoi() scarta tutto quello che non c'entra dopo i caratteri numerici, quindi non serve nemmeno eliminare il newline".
E' vero che atoi() scarta tutto quel che non c'entra dopo i caratteri numerici, però se i caratteri numerici a inizio stringa non ci sono proprio, atoi() accetta comunque la stringa e restituisce 0, ovvero la stessa cosa che restituirebbe se uno le avesse passato "0{parsed_message}" o "0\n{parsed_message}". Dato che il valore 0 è quello che attiva l'uscita dal menu', e dato che volevo fare in modo che
non si potesse lasciare il menu' senza un'immissione valida, questo comportamento è inaccettabile.
Il valore di ritorno di atoi() è 0 anche se le si passa una stringa che contiene solo "\n", ovvero se si preme return senza avere immesso alcunché. Anche questo è un comportamento che non è coerente con quel che volevo ottenere.
Dunque, volevo che l'immissione fosse
con certezza e intenzionalmente costituita da sole cifre 0-9 (ovvero un numero intero positivo), per cui mi serviva una funzione che verificasse tale condizione. Per questo ho preparato la funzione Numero(). Però Numero() segnala come numero non valido una stringa che contenga
qualsiasi carattere che non sia una cifra 0-9, quindi avrebbe segnalato come non valida anche una stringa come "2\n{parsed_message}". Per questo ho dovuto accertarmi che l'ultimo carattere della stringa non fosse '\n' e, per pura paranoia, ho anche voluto accertarmi, con if(l!=0), che la stringa contenesse effettivamente dei caratteri.
Alla fine della fiera, dunque, non dovrebbe essere possibile lasciare il menù in altro modo che immettendo un numero compreso tra 0 e il valore del parametro nVoci, perché viene richiesta a oltranza una nuova immissione fintanto che "scelta < 0 || scelta >= nVoci".
P.S. - Non solo ho "snobbato" strlen() da string.h, ho "snobbato" pure isdigit() da ctype.h!
". Dato che il valore 0 è quello che attiva l'uscita dal menu', e dato che volevo fare in modo che
non si potesse lasciare il menu' senza un'immissione valida, questo comportamento è inaccettabile.
Il valore di ritorno di atoi() è 0 anche se le si passa una stringa che contiene solo "\n", ovvero se si preme return senza avere immesso alcunché. Anche questo è un comportamento che non è coerente con quel che volevo ottenere.
Dunque, volevo che l'immissione fosse
con certezza e intenzionalmente costituita da sole cifre 0-9 (ovvero un numero intero positivo), per cui mi serviva una funzione che verificasse tale condizione. Per questo ho preparato la funzione Numero(). Però Numero() segnala come numero non valido una stringa che contenga
qualsiasi carattere che non sia una cifra 0-9, quindi avrebbe segnalato come non valida anche una stringa come "2\nM'accorgo d'essermi spiegato in modo pessimo. Ci riprovo.
Lumo:
"Che io sappia atoi() scarta tutto quello che non c'entra dopo i caratteri numerici, quindi non serve nemmeno eliminare il newline".
E' vero che atoi() scarta tutto quel che non c'entra dopo i caratteri numerici, però se i caratteri numerici a inizio stringa non ci sono proprio, atoi() accetta comunque la stringa e restituisce 0, ovvero la stessa cosa che restituirebbe se uno le avesse passato "0{parsed_message}" o "0\n{parsed_message}". Dato che il valore 0 è quello che attiva l'uscita dal menu', e dato che volevo fare in modo che
non si potesse lasciare il menu' senza un'immissione valida, questo comportamento è inaccettabile.
Il valore di ritorno di atoi() è 0 anche se le si passa una stringa che contiene solo "\n", ovvero se si preme return senza avere immesso alcunché. Anche questo è un comportamento che non è coerente con quel che volevo ottenere.
Dunque, volevo che l'immissione fosse
con certezza e intenzionalmente costituita da sole cifre 0-9 (ovvero un numero intero positivo), per cui mi serviva una funzione che verificasse tale condizione. Per questo ho preparato la funzione Numero(). Però Numero() segnala come numero non valido una stringa che contenga
qualsiasi carattere che non sia una cifra 0-9, quindi avrebbe segnalato come non valida anche una stringa come "2\n{parsed_message}". Per questo ho dovuto accertarmi che l'ultimo carattere della stringa non fosse '\n' e, per pura paranoia, ho anche voluto accertarmi, con if(l!=0), che la stringa contenesse effettivamente dei caratteri.
Alla fine della fiera, dunque, non dovrebbe essere possibile lasciare il menù in altro modo che immettendo un numero compreso tra 0 e il valore del parametro nVoci, perché viene richiesta a oltranza una nuova immissione fintanto che "scelta < 0 || scelta >= nVoci".
P.S. - Non solo ho "snobbato" strlen() da string.h, ho "snobbato" pure isdigit() da ctype.h!
". Per questo ho dovuto accertarmi che l'ultimo carattere della stringa non fosse '\n' e, per pura paranoia, ho anche voluto accertarmi, con if(l!=0), che la stringa contenesse effettivamente dei caratteri.
Alla fine della fiera, dunque, non dovrebbe essere possibile lasciare il menù in altro modo che immettendo un numero compreso tra 0 e il valore del parametro nVoci, perché viene richiesta a oltranza una nuova immissione fintanto che "scelta < 0 || scelta >= nVoci".
P.S. - Non solo ho "snobbato" strlen() da string.h, ho "snobbato" pure isdigit() da ctype.h!
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.