Oppure

Loading
04/05/16 11:01
AldoBaldo
Postato originariamente da lumo:Che io sappia atoi() scarta tutto quello che non c'entra dopo i caratteri numerici, quindi non serve nemmeno eliminare il newline
(A proposito, strlen è brutta? :rotfl: )


Sì, atoi() scarta quel che segue il primo carattere non numerico, però restituisce 0 se la stringa NON rappresenta un numero, e Numero() segnala come non-numero qualsiasi stringa che contenga caratteri non numerici, quindi anche una stringa numerica valida seguita da un '\n'. Dunque, se voglio che venga effettuata una verifica attendibile non posso fare a meno dei due passi che ho fatto (credo... smentiscimi se non è vero).

strlen() la uso, ma in questo caso non volevo includere <string.h> solo per quello. Una fisima mia - meno roba includo più son contento.
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.
04/05/16 19:56
AldoBaldo
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.
05/05/16 7:09
torn24
Si vede la padronanza del linguaggio in una soluzione complessa, MA MI CHIEDO, il problema riscontrato è, nell'eventuale inserimento di un carattere sorgono "problemi" perché l'input atteso è un intero, visto che uno switch() può valutare anche char, si prenda come input un carattere e si valutano i case su caratteri, in questo modo se il carattere non è valutato nello switch() si ripete il loop.



        char c;
        do{
                scanf("%c",&c);
                while(getchar()!='\n');
                switch(c){

                    case '1':
                            function();
                            break;
                    case '2':
                            function();
                            break; 
                    case '3':
                            function();
                            break;
                    case '4':
                            function();
                            break;
                    case '5':
                            function();
                            break;
                    default:
                            printf("Input non valido\n");
                            break;


               }

       }while(c!='5');




Ultima modifica effettuata da torn24 05/05/16 7:12
aaa
05/05/16 12:46
AldoBaldo
Sì, ed è pure una soluzione molto chiara da "leggere", per cui mi piace. Però ha dei limiti:

1. il menù non può avere più di 9 voci, più una per l'uscita e
2. se (ad esempio) immetto "21", accetta come valido il "2" (che potrebbe non essere l'immissione intenzionale)

Un vantaggio è invece non serve dimensionare un buffer d'input, per cui è impossibile incorrere in errori dovuti a un dimensionamento troppo "risicato". E' un vantaggio non da poco.

Personalmente, fin dove riesco ad arrivare, preferisco fare in modo che una funzione sia il più generica e riutilizzabile possibile e che in immissione dati non siano concesse più ambiguità del necessario, ma queste sono alcune mie paranoie (a volte, ammetto, danno luogo ad inutili complicazioni se non a vere e proprie "paralisi" spaghettose). Ciò spiega perché ho fatto quel "rigiro".

Edit: il limite n. 1 potrebbe essere attenuato (in pratica, eliminato) prevedendo l'uso anche di altri caratteri, magari fino a differenziare maiuscole e minuscole o accettare segni di interpunzione ecc. A me non piacerebbe un menù dove mi si richiedesse di inserire ':' per attivare una certa funzione...
Ultima modifica effettuata da AldoBaldo 05/05/16 12:51
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.