Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260

    [C] Switch che va in crash se non inserisco un numero

    Salve a tutti.
    Ho compilato la seguente parte di codice e andando a testare mi va in crash quando inserisco un carattere invece di un numero, insomma quando il carattere immesso è diverso da un numero.
    codice:
    #include<stdio.h>
    
    int login(){
    	int indice;
    	printf("Scegli un azione inserendo il numero corrispondente\n");
        printf("*********************************************************\n");
        printf("1. Accesso con autenticazione\n");
        printf("2. Accesso senza autenticazione\n");
        printf("0. Uscita\n");
        printf("*********************************************************\n");
        scanf("%d",&indice);
        switch (indice){
        	case 0: /*Usicta dal login*/
        	printf("\n\nArrivederci!\n\n");
        	break;
        
        	case 1:/*Accesso con autenticazione*/
       		printf("Accesso con autenticazione!\n");
       	 	break;
        
        	case 2:/*Accesso senza autenticazione*/
       	 	printf("Accesso senza autenticazione!\n");
        	break;
        
        	default://Riaccede al login per autenticazione errata
        	printf("\n\nHai inserito un indice inesistente, riprova!\n\n");
        	login();
        	break;
       	}
       	return 0;	
    }
    
    int main (void){
    	login();
    	return 0;
    }
    Se metto tutto lo switch nel main tutto ok nel senso che se inserisco un carattere o numero o quel che sia fa entrare in azione il default e quindi non succede niente.
    Se invece compilo il codice come sopra e inserisco un carattere mi parte all'infinito lo switch e sono costretto ad interrompere.
    C'è un modo per far si che all'immissione da tastiera faccio controllare al computer che quello inserito sia effettivamente un numero e non un carattere?
    E' l'unica soluzione che mi sia venuta in testa.

  2. #2
    Puoi controllarlo cosi:
    do
    scanf("%d",&indice);
    while ((indice <= 0) && (indice >=2))

    cosi sei sicuro che si inserisca un valore compreso tra 0 e 2 che ti interessa...il problema, comunque, è la scanf, che lascia il buffer di lettura sporco quando inserisci un carattere. è risaputo infatti i problemi che arreca una scanf purtroppo.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Attenzione ... non devi richiamare ricorsivamente la login dentro la login!

    Semmai imposta un ciclo nella login da cui uscirai solo se le operazioni si sono svolte correttamente.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Ho risolto con una serie di if che deve "superare" il carattere inserito fino ad arrivare allo switch soltanto che ora mi è uscito un errore che non capisco proprio cosa sia.
    Posto la parte di codice interessata con l'errore:
    codice:
    file "main.c"
    
    #include<stdio.h>
    #include"funzioni.h"
    
    int main (void){
    	printf("\n\nEffettuando l'autenticaione avrai accesso a tutte le opzioni della rubrica (visualizzazione e modifica),");
    	printf("\nse invece non ti autentichi avrai diritto soltanto a visualizzare la rubrica senza poterla modificare.\n");
    	login();
    	return 0;
    }
    
    
    
    file "funzioni.c"
    
    int login(){
    	int scelta[1], a, b='n';
    	printf("Scegli un azione inserendo il numero corrispondente\n");
        printf("*********************************************************\n");
        printf("1. Accesso con autenticazione\n");
        printf("2. Accesso senza autenticazione\n");
        printf("0. Uscita\n");
        printf("*********************************************************\n");
        scanf("%s",scelta);
        if(strlen(scelta)>1)
        	b='s';
        else if((scelta[0]<48)||(scelta[0]>57))
        	b='s';
        else{
        	a=atoi(scelta);
        	switch (scelta){
        		case 0: /*Usicta dal login*/
        		printf("\n\nArrivederci!\n\n");
        		break;
        	
        		case 1:/*Accesso con autenticazione*/
       			autenticazione();
       	 		break;
        	
       			case 2:/*Accesso senza autenticazione*/
      	 		presentazione2();
       			menu2();
        		break;
        	
        		default://Riaccede al login per autenticazione errata
        		printf("\n\nHai inserito un indice inesistente, riprova!\n\n");
        		login();
        		break;
        	}
        }
        if(b=='s'){
       		printf("\n\nHai inserito un indice inesistente, riprova!\n\n");
       		login();
       	}
    	return 0;	
    }
    L'errore che mi riporta è il seguente:
    /tmp/cceicGgu.o: In function main.c:
    main.c.text+0.23): undefined reference to 'login'
    collect 2: ld return 1 exit status

    Ma possibile che non c'è mai una cosa che va per il verso giusto a prima botta???

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fix87
    Ho risolto con una serie di if che deve "superare" il carattere inserito fino ad arrivare allo switch soltanto che ora mi è uscito un errore che non capisco proprio cosa sia.
    Posto la parte di codice interessata con l'errore:
    codice:
    file "main.c"
    
    #include<stdio.h>
    #include"funzioni.h"
    
    int main (void){
    	printf("\n\nEffettuando l'autenticaione avrai accesso a tutte le opzioni della rubrica (visualizzazione e modifica),");
    	printf("\nse invece non ti autentichi avrai diritto soltanto a visualizzare la rubrica senza poterla modificare.\n");
    	login();
    	return 0;
    }
    
    
    
    file "funzioni.c"
    
    int login(){
    	int scelta[1], a, b='n';
    	printf("Scegli un azione inserendo il numero corrispondente\n");
        printf("*********************************************************\n");
        printf("1. Accesso con autenticazione\n");
        printf("2. Accesso senza autenticazione\n");
        printf("0. Uscita\n");
        printf("*********************************************************\n");
        scanf("%s",scelta);
        if(strlen(scelta)>1)
        	b='s';
        else if((scelta[0]<48)||(scelta[0]>57))
        	b='s';
        else{
        	a=atoi(scelta);
        	switch (scelta){
        		case 0: /*Usicta dal login*/
        		printf("\n\nArrivederci!\n\n");
        		break;
        	
        		case 1:/*Accesso con autenticazione*/
       			autenticazione();
       	 		break;
        	
       			case 2:/*Accesso senza autenticazione*/
      	 		presentazione2();
       			menu2();
        		break;
        	
        		default://Riaccede al login per autenticazione errata
        		printf("\n\nHai inserito un indice inesistente, riprova!\n\n");
        		login();
        		break;
        	}
        }
        if(b=='s'){
       		printf("\n\nHai inserito un indice inesistente, riprova!\n\n");
       		login();
       	}
    	return 0;	
    }
    L'errore che mi riporta è il seguente:
    /tmp/cceicGgu.o: In function main.c:
    main.c.text+0.23): undefined reference to 'login'
    collect 2: ld return 1 exit status

    Ma possibile che non c'è mai una cosa che va per il verso giusto a prima botta???
    Dov'è l'header?

    E come ti hanno già suggerito, non utilizzare la ricorsione per queste cose, ma un banalissimo ciclo.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Cosa c'è nel file funzioni.h ?

    P.S. Occhio a quello che ti ho scritto prima ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Ci sono tutti i prototipi delle funzioni usate nel file funzioni.c e c'è anche il prototipo login();
    Ma c'è un modo per imparare a capire gli errori del compilatore?
    Almeno non vi devo sempre scocciare a voi ogni volta XD

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Originariamente inviato da oregon
    Attenzione ... non devi richiamare ricorsivamente la login dentro la login!

    Semmai imposta un ciclo nella login da cui uscirai solo se le operazioni si sono svolte correttamente.
    Quindi nel ciclo while ci metto un controllore (per esempio una variabile) che cambia soltanto se le operazioni sono corrette altrimenti finchè le operazioni sono sbagliate mi ritorna nel while?
    Scusami ma l'ho visto solo ora il post.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Fix87
    Ci sono tutti i prototipi delle funzioni usate nel file funzioni.c e c'è anche il prototipo login();
    Il fatto è che l'errore lo fornisce il linker (ld) quindi non viene compilato il codice della funzione login. Dato che dici di averlo nel file "funzioni.c" dicci come compili i due file "main.c" e "funzioni.c" ...

    Ma c'è un modo per imparare a capire gli errori del compilatore?
    Con l'esperienza e lo studio di anni ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fix87
    Ci sono tutti i prototipi delle funzioni usate nel file funzioni.c e c'è anche il prototipo login();
    Ma c'è un modo per imparare a capire gli errori del compilatore?
    Almeno non vi devo sempre scocciare a voi ogni volta XD
    Supponendo tu abbia scritto correttamente il prototipo nell'header, hai compilato il file d'implementazione? Ovviamente prima o insieme al main.

    Per capire gli errori, googla e scopri il loro significato, a volte non ce n'è bisogno... l'errore che hai ora è chiaro che significa che non trova la funzione login che stai chiamando nel main.
    Poi ovvio che i compilatori non sono onnipotenti e ogni errore può essere causato da un milioni di cose diversi, e lì è esperienza...

    Originariamente inviato da Fix87
    Quindi nel ciclo while ci metto un controllore (per esempio una variabile) che cambia soltanto se le operazioni sono corrette altrimenti finchè le operazioni sono sbagliate mi ritorna nel while?
    Scusami ma l'ho visto solo ora il post.
    Una cosa del genere, prova...

    EDIT: stavolta sono stato preceduto io.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.