Newsgroup: it.comp.lang.c
Titolo: Chi mi aiuta?

Salve,se qualcuno potesse aiutarmi a capire perchè, ogni volta che viene
eseguito il corpo del while,viene stampato 2 volte il gruppo di printf !!
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
 char risp;
 
 printf("   *****************  MENU' ********************\n\n");
 
  while (1) {
 
       printf("1) (premi 1) \n");
       printf("2) (premi 2) \n");
       printf("3) (premi 3) \n");
       printf("4) esci (premi 4) \n");
 
       scanf("%c",&risp); 
 
 
         switch (risp) {
  	     case '1' :
  	          {
  		    printf("case 1 \n");
  		    break;
                  }
 
             case '2' :
                   {
                     printf("case 2 \n");
                     break;
                   } 	       
 
             case '3' :break;
             case '4' :exit(0);
 
         } // switch end               
 
  } 
   return 0;
}   		
 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

        scanf("%c",&risp);
Per questa riga!
ogni volta che metti un valore digiti due caratteri (anche invio) (per farla
in parole molto povere)...
Una soluzione stupida al problema potrebbe essere questa:
<CODE>
#include <stdio.h>
#include <stdlib.h>
int main()
{
     char risp[16];
     printf("   *****************  MENU' ********************\n\n");
     while(1){
          printf("1) (premi 1) \n");
          printf("2) (premi 2) \n");
          printf("3) (premi 3) \n");
          printf("4) esci (premi 4) \n");
          gets(risp);
          switch (atoi(risp)) {
          case 1 :
               printf("case 1 \n");
               break;
          case 2 :
               printf("case 2 \n");
               break;
          case 3 :break;
          case 4 :exit(0);
          } // switch end
     }
     return 0;
}
</CODE>
Ora risp[16] e' una stringa. Leggiamo con gets() una stringa, e poi la
convertiamo in numero.
Successivamente facciamo uno switch sui possibili numeri scelti.
Tommy

        scanf("%c",&risp);
prova a cambiare
 scanf("%c",&risp);
con
 scanf("%c%*c",&risp);
Ciiips
Aragorn
--
FAQ non ufficiali K7S5A:
http://www.holyword.it/aragorn/ecs_faq.htm

          gets(risp);
<...>
Mai usare funzioni di input che non assicurino la lettura di un numero
massimo di caratteri.  Mai usare, in sostanza, scanf() o gets(),
bisogna usare fgets().

Grazie a tutti per le vostre risposte


 
Ciao.
ValerioZ

 Ti basta prendere "risp" come un intero:
e' vero ma in quel modo basta inserire una cosa che non sia un intero per
mandare in crash l'applicazione!
Tommy

 wrote in news:avi7s3$rd4$
1...@knossos.btinternet.com
:

metti il caso default e hai risolto...
prende quello che inserisci con il suo codice ASCI e se non corrisponde a 
nulla va a default
FUNGE! garantito 100%
Ciao
ValerioZ

 FUNGE! garantito 100%
ValerioZ, ho fatto come dici tu: ho preso il suo programma tale e quale, ho
messo risp come intero e lo leggo come %d invece che %c nella scanf. Inoltre
faccio lo switch in base a numeri (1) invece di caratteri ('1').
Ho infine aggiunto un case default che dovrebbe uscire dalla applicazione:
<CODE>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int risp;
    printf("   *****************  MENU' ********************\n\n");
    while (1) {
        printf("1) (premi 1) \n");
        printf("2) (premi 2) \n");
        printf("3) (premi 3) \n");
        printf("4) esci (premi 4) \n");
        scanf("%d",&risp);
        switch (risp) {
        case 1 :
            printf("case 1 \n");
            break;
        case 2 :
            printf("case 2 \n");
            break;
        case 3 :break;
        case 4 :exit(0);
        default: exit(0); break;
        } // switch end
    }
    return 0;
}
</CODE>
ok, se metto 1,2,3,4 funziona. Anche 6. e' il default che mi esce dal
programma come con 4.
Se metto 't'  come primo input (che non e' un intero, era questo che volevo
dire) apparentemente funziona, esce dalla applicazione. Purtroppo se metto
2, premo invio e poi metto 't' va in loop infinito.... di cui ti posto una
parte in fondo.
Stessa cosa se come primo input metto "2t".
Fammi sapere:
<LOOP>
1) (premi 1)
2) (premi 2)
3) (premi 3)
4) esci (premi 4)
case 2
1) (premi 1)
2) (premi 2)
3) (premi 3)
4) esci (premi 4)
case 2
1) (premi 1)
2) (premi 2)
3) (premi 3)
4) esci (premi 4)
case 2
1) (premi 1)
2) (premi 2)
3) (premi 3)
4) esci (premi 4)
case 2
1) (premi 1)
2) (premi 2)
3) (premi 3)
4) esci (premi 4)
</LOOP>
Tommy