Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C]-Verifica validita' input da tastiera
Forum - C/C++ - [C]-Verifica validita' input da tastiera - Pagina 2

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 15:11
Mercoledì, 12/07/2017
Testo quotato

Postato originariamente da AldoBaldo:

Ora te lo do io un grattacapo: e se l'utente volesse annullare per evitare la scelta? Ad esempio si potrebbe proporre un "Sei un campione del ciclismo? (s/n/a)" dove "a" potrebbe stare per "annulla". In caso d'annullamento la funzione potrebbe restituire -1, per cui 1:vero, 0:falso, -1:annullamento. Ma son certo che a pensarci e ripensarci ci viene in mente ancora qualche altro dettaglio.



Ecco la soluzione (ho preso in prestito il tolower( getchar() ) )

func.c
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int selecTFA( int vero, int falso, unsigned char *carattere ){
  5.  
  6.     int c = 0;          
  7.     *carattere = '\0';
  8.  
  9.     // prelevo e testo dal buffer il 1° carattere
  10.     c = tolower( getchar());
  11.  
  12.     if( c == tolower( vero ) || c == tolower( falso ) || c == 'a' ){
  13.  
  14.         *carattere =(unsigned char)tolower( c );
  15.  
  16.         // prelevo e testo dal buffer il 2° carattere
  17.         c = getchar();
  18.  
  19.         if( (c == '\n') ){
  20.             if( *carattere == 'a' )
  21.                 return -1;
  22.  
  23.             return 1;
  24.         }
  25.     }
  26.     while( (getchar() != '\n') );
  27.    //Svuoto il  buffer nel caso di richiesta di nuova immissione
  28.  
  29.     return 0;
  30. }




main.c
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int selecTFA( int ch1, int ch2, unsigned char *caracter );
  4.  
  5. int main( int arcv, char *arcg[] ){
  6.  
  7.     int annulla = 0;
  8.     unsigned char letter=' ' ;
  9.  
  10.     printf( "IMMETTERE [%c/%c] [A per annullare] :", 'S', 'N' );
  11.  
  12.     while(!(annulla = selecTFA( 's', 'n', &letter ))){
  13.     // mi da warming C4706 VS2017, è cattiva programmazione? ho attivato gli avvisi /W4
  14.         printf( "%s\n%s [%c/%c]:",
  15.             "IL CARATTERE IMMESSO NON E'CORRETTO",
  16.             "IMMETTERE",
  17.             'S', 'N' );
  18.     }
  19.     if( annulla == -1 )
  20.         printf( "Hai annullato\n" );
  21.    else
  22.         printf( "IL carattere scelto e' il: %c\n\n", letter );
  23.  
  24.     return 0;
  25. }




Volendo si potrebbero impostare 256 scelte diverse....

Ultima modifica effettuata da Mikelius il 12/07/2017 alle 15:13
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 16:45
Mercoledì, 12/07/2017
Anzi, molto più semplicemente si potrebbe demandare tutto al chiamante e verificare solamente che sia stato immesso 1 solo valore

func.c
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. unsigned char selecC(void){
  5.  
  6.     unsigned char carattere ='\0' ; //Inizzializzo per sicurezza
  7.  
  8.     carattere = (unsigned char)getchar() ;
  9.  
  10.  
  11.     if( ( getchar() == '\n') ){
  12.  
  13.             return carattere;
  14.         }
  15.  
  16.     while( (getchar() != '\n') );
  17.  
  18.     return '\0';
  19. }





main.c
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. unsigned char selecC( void );
  4.  
  5. int main( int arcv, char *arcg[] ){
  6.  
  7.     unsigned char letter=' ' ;
  8.  
  9.     printf( "IMMETTERE [%c/%c] [A per annullare] :", 'S', 'N' );
  10.  
  11.     letter = selecC();
  12.  
  13.     switch(  letter){
  14.     case 'a':
  15.     case 'A':
  16.         printf( "SCELTO ANNULLA\n" );
  17.         break;
  18.  
  19.     case 'S':
  20.     case 's':
  21.         printf( "SCELTO SI\n" );
  22.         break;
  23.  
  24.     case 'N':
  25.     case 'n':
  26.         printf( "SCELTO NO\n" );
  27.         break;
  28.  
  29.     default:
  30.         printf( "SCELTA NON VALIDA\n" );
  31.     }
  32.  
  33.     return 0;
  34. }


Ultima modifica effettuata da Mikelius il 12/07/2017 alle 16:46
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 614
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 18:12
Mercoledì, 12/07/2017
Le soluzioni sono veramente tante! Alla fine della fiera basta che siano funzionali e non generino errori o inutile confusione (dove utile o inutile dipende da quel che ti serve nel caso specifico).


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
TheDarkJuster (Member)
Guru^2


Messaggi: 1616
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 19:13
Mercoledì, 12/07/2017
Fatti passare tutto da console se possibile. È la soluzione migliore per chi usa la console o per un possibile wrapper grafico alla tua app

PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 19:33
Mercoledì, 12/07/2017
Testo quotato

Postato originariamente da AldoBaldo:

Le soluzioni sono veramente tante! Alla fine della fiera basta che siano funzionali e non generino errori o inutile confusione (dove utile o inutile dipende da quel che ti serve nel caso specifico).



Si concordo.
Qui ho chiesto se questa mia soluzione potesse avere dei contro o bug che a me sfuggono.
Vedendo la tua, ho avuto degli spunti.
Si potrebbe costruire una piccolissima libreria con alcune funzioni per adempiere alle scelte.


Testo quotato

Postato originariamente da TheDarkJuster:

Fatti passare tutto da console se possibile. È la soluzione migliore per chi usa la console o per un possibile wrapper grafico alla tua app



In che senso mi devo far passare tutto da console?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1616
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:49
Mercoledì, 12/07/2017
Testo quotato

Postato originariamente da Mikelius:

Testo quotato

Postato originariamente da AldoBaldo:

Le soluzioni sono veramente tante! Alla fine della fiera basta che siano funzionali e non generino errori o inutile confusione (dove utile o inutile dipende da quel che ti serve nel caso specifico).



Si concordo.
Qui ho chiesto se questa mia soluzione potesse avere dei contro o bug che a me sfuggono.
Vedendo la tua, ho avuto degli spunti.
Si potrebbe costruire una piccolissima libreria con alcune funzioni per adempiere alle scelte.


Testo quotato

Postato originariamente da TheDarkJuster:

Fatti passare tutto da console se possibile. È la soluzione migliore per chi usa la console o per un possibile wrapper grafico alla tua app



In che senso mi devo far passare tutto da console?



programma arg1 arg2 arg3

PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 21:33
Giovedì, 13/07/2017
Testo quotato

Postato originariamente da TheDarkJuster:

programma arg1 arg2 arg3



capito. Si, cercherò di fare come consigli.
In alcuni libri avevo letto che sarebbe più opportuto passare come argomenti delle variabili per contenere i risultati delle funzioni, evitando ti ritornarli con un return. Tu che mi consigli?

Ultima modifica effettuata da Mikelius il 13/07/2017 alle 21:39
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 22:31
Giovedì, 13/07/2017
Testo quotato

Postato originariamente da Mikelius:

Testo quotato

Postato originariamente da TheDarkJuster:

programma arg1 arg2 arg3



capito. Si, cercherò di fare come consigli.
In alcuni libri avevo letto che sarebbe più opportuto passare come argomenti delle variabili per contenere i risultati delle funzioni, evitando ti ritornarli con un return. Tu che mi consigli?



È un problema del C che non permette di ritornare più valori contemporaneamente.
Dove ha senso si usa una struttura allocata dinamicamente e si ritorna quella, altrimenti si aggiungono degli argomenti alla funzione per poter salvare più risultati. Ovviamente devono essere puntatori e vanno dereferenziati, quindi c'è in più il rischio che per sbaglio venga passato NULL.
In aggiunta questo di solito si ritorna anche qualcosa tipo un bool o una enum che indica il successo dell'operazione.

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo