Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema menu
Forum - C/C++ - problema menu - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:56
Mercoledì, 04/05/2016
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 "0\0" o "0\n\0". 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\0". 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.
PM Quote
Avatar
torn24 (Normal User)
Pro


Messaggi: 156
Iscritto: 04/01/2008

Segnala al moderatore
Postato alle 9:09
Giovedì, 05/05/2016
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.


Codice sorgente - presumibilmente C/C++

  1. char c;
  2.         do{
  3.                 scanf("%c",&c);
  4.                 while(getchar()!='\n');
  5.                 switch(c){
  6.  
  7.                     case '1':
  8.                             function();
  9.                             break;
  10.                     case '2':
  11.                             function();
  12.                             break;
  13.                     case '3':
  14.                             function();
  15.                             break;
  16.                     case '4':
  17.                             function();
  18.                             break;
  19.                     case '5':
  20.                             function();
  21.                             break;
  22.                     default:
  23.                             printf("Input non valido\n");
  24.                             break;
  25.  
  26.  
  27.                }
  28.  
  29.        }while(c!='5');


Ultima modifica effettuata da torn24 il 05/05/2016 alle 9:12
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 14:46
Giovedì, 05/05/2016
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 il 05/05/2016 alle 14: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.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo