Newsgroup: it.comp.lang.c
Titolo: problema con switch

scusate sto provando a scrivere dei programmi in c
pero' ho un problema con switch che non riesco a capire.
sotto riporto il codice.
Il problema e' che il file viene aperto e viene anche scritto,
solo che il primo carattere viene troncato.
ad esemp. se scrivo in nomi pippo quando vado ad aprire il file elenchi mi
trovo ippo e il numeri non mi viene scritto per niente, mentre se levo lo
switch e lascio solo il while
nel file viene scritto tutto corretamente.
grazie a tutti
#include <stdio.h>
#include <stdlib.h>
char nomi[40],numeri[7];
FILE *fp;
int scelta,ch,x,y;
main()
{
   while(1)
   {
   puts("1)Inserisci\n");
   puts("2)In costruzione\n");
   scanf("%d",&scelta);
   switch (scelta)
   {
      case 1: {
        printf("Inserisci nome e premere invio\n");
        gets(nomi);
        getchar();
        printf("Inserisci numero e premere invio\n");
        gets(numeri);
        getchar();
        if((fp=fopen("d:\ elenchi", "w+"))!=NULL)
        {
        printf("Il file e' stato aperto corretamente\n");
        fprintf(fp,"%s\t%s",nomi,numeri);
        fclose(fp);
        }
        else
          printf("Il file non e' stato aperto corretamente\n");
       break;
     }
     case 2: {
       printf("In costruzione\n");
     }
  }
   }
return(0);
}

Il problema non era in switch.
Non capisco come mai a volte usi "puts" e a volte "printf"
Ah, gcc mi dice che "gets" non dovrebbe essere usata.
Un altro paio di cose. Hai dichiarato alcune variabili inutili, come x e
y, salvavi il numero in un array di caratteri quando potevi
tranquillamente salvarlo come numero e usi delle variabili globali che,
ora come ora, andrebbero dichiarate locali.
Al main aggiungi i parametri di entrata ed uscita.
Ah, i blocchi di codice dei case non hanno bisogno di stare tra parentesi
graffe.
Il codice, rivisto, e' cosi'
#include <stdio.h>
int main(void)
{
 char nomi[40];
 FILE *fp;
 int scelta,numeri;
 while(1)
   {
    printf("1)Inserisci\n");
    printf("2)In costruzione\n");
    scanf("%d",&scelta);
    getchar();
    switch (scelta)
    {
      case 1: 
        printf("Inserisci nome e premere invio\n");
        scanf("%s",nomi);
	getchar();
        printf("Inserisci numero e premere invio\n");
        scanf("%d",&numeri);
	getchar();
        if((fp=fopen("elenchi", "w+"))!=NULL)
        {
        printf("Il file e' stato aperto corretamente\n");
        fprintf(fp,"%s\t%d",nomi,numeri);
        fclose(fp);
        }
        else
          printf("Il file non e' stato aperto corretamente\n");
       break;
 
     case 2:
       printf("In costruzione\n");
       break;
   }
 return(0);
}
Ciao,
Riccardo
-- 
-=Riccardo Galli=-
 _,e.
s~  ``
 ~@.   ideralis Programs
.   ol 
 `**~  
http://www.sideralis.net

 snip >
Il codice non č testato: pensaci tu.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void istruzioni( void )
{
  puts( "1)Inserisci" );	
  puts( "2)In Costruzione" );
}
int main(void)
{
  char nomi[40], numeri[7], *p;
  FILE *fp;
  int scelta;
  istruzioni();
  while( ( scelta = getchar() ) != EOF )
  {
     getchar();
     switch( scelta )
     {
      case '1': {
       puts( "Inserisci nome e premere invio" );
       fgets( nomi, sizeof nomi, stdin );
       if( ( p = strchr( nomi, '\n' ) ) != NULL )
         *p = '\0';
       puts( "Inserisci numero e premere invio" );
       fgets( numeri, sizeof numeri, stdin );
       if( ( p = strchr( numeri, '\n' ) ) != NULL )
         *p = '\0';
       if( ( fp=fopen( "elenchi", "w+" ) ) != NULL )
       {
         printf( "Il file e' stato aperto corretamente\n" );
	 fprintf(fp,"%s\t%s",nomi,numeri);
	 fclose(fp);
       }
       else
         printf("Il file non e' stato aperto corretamente\n");
       break;
       }
 
      case '2':
       printf("In costruzione\n");
 
    }
   break;
  }
 return 0;
}
Cerca la FAQ del gruppo di discussione comp.lang.c e scopri perchč gets
non č da usare, scanf č da usare piů che raramente, e le variabili
globali sono spesso una cattiva idea.
Il codice sopra ha ancora molti difetti, miglioralo tu con i consigli
della FAQ. (trad. speriamo compili)
Ciao,
-- 
oOO()             |Nicholas Wieland|
/ _/              |nicholas_wieland|
|/ [ Step on the ]|    @
yahoo.it
   |
\_)[  right foot ]|________________|

alla fine dell'acquisizione della stringa e dei numeri può darsi che ti
rimanga qualcosa nel buffer di input.
tanto per sicurezza prova a mettere un
fflush(stdin);
subito dopo ogni acquisizione da stdin.
serve per svuotare il buffer.

luca preziati ha scritto:

No. Serve per non far girare bene il tuo programma. fflush opera solo sui
file aperti in output, e quindi non su stdin. Se la applicassi sarebbe
undefined behavior. Al max. puoi usare, in modo standard e portatile:
while (getchar () != '\n')
        ;       // ciclo vuoto intenzionalmente
-- 
Andrea Bergia - studente              Linux Registred User #281550
"The one thing we're all waiting for, is peace on Earth and an end to war,
it's a miracle we need, the miracle, the miracle, 
Peace on earth and end to war today,
That time will come one day you'll see when we can all be friends"


spiacente informarti che sullo stdin quando l'ho usato funzionava
egreggiamente e se ti interessa me l'ha detto un ingegnere informatico di
usarlo prova....

 usarlo prova....
Question 12.26
How can I flush pending input so that a user's typeahead isn't read at
the next prompt? Will fflush(stdin) work?
fflush is defined only for output streams. Since its definition of
``flush'' is to complete the writing of buffered characters (not to
discard them), discarding unread input would not be an analogous meaning
for fflush on input streams.
There is no standard way to discard unread characters from a stdio input
stream, nor would such a way be sufficient unread characters can also
accumulate in other, OS-level input buffers.
References: ANSI Sec. 4.9.5.2
ISO Sec. 7.9.5.2
H&S Sec. 15.2 
Se ti danno un consiglio magari verifica nei posti 'classici' come la
faq di c.l.c., altrimenti l'ng perde significato, mica siamo qui a
contraddirci per 'gusto'. :)


 usarlo prova....
Questo dimostra solo che i titoli non significano che uno sappia 
programmare. Significa solo che alle persone piace parlare anche quando non 
sanno di cosa parlano.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

se ho provato e funziona non so cosa dirti....

 programmare. Significa solo che alle persone piace parlare anche quando
non  sanno di cosa parlano.
il fatto che non ti poni la domanda che sistema usassi e non me l'hai mai
posta negando il funzionamento di fflush(stdin) indica forse il fatto che il
cattivo funzionamento sotto alcuni sistemi(cmq l'ho usato anche sotto linux
non ricordo quale versione) non era noto neanche a te!
dunque come postato già in precedenza avete un po' i modi del so tutto io
senza mai andare a specificare i limiti di quello che dite e a dire funziona
solo in determinate condizioni, visto che lo sapete, mentre io lo ignoro e
sto solo cercando di dare il mio max contributo al ng.
Con questo appunto vi saluto.
P.s.: non mi danno fastidio le critiche ma come le fate. Il no non esiste
perchè qui penso ognuno metta a disposizione la propria esperienza e dunque
sarebbe anche cortese rispettare gli altri nelle parole e spiegare anche il
perchè del no.

 ignoro e sto solo cercando di dare il mio max contributo al ng.
Io non ho mai detto "guarda quanto ce l'ho grosso", senza dimostrarlo, 
quindi non e' il caso:
- che rivolgi l'accusa a me, visto che non l'ho mai fatto: se rispondo 
  motivo anche la risposta;
- che ti appelli al mio posto per attaccare qualcun'altro, visto che io non 
  ho mai tenuto il comportamento da te lamentato;
Se non ti diciamo i limiti dell'fflush con esattezza forse e' perche' non si 
possono conoscere se non per prove e anche quelle non sono affidabili 
perche' ti ho gia' spiegato come possano cambiare i comportamenti in 
presenza di "undefined behaviour", anche da una versione all'altra.


 se ho provato e funziona non so cosa dirti....
Malissimo: le prove servono per convalidare le teorie, non per crearle... 
soprattutto in presenza di standard. Sai perche'? Proprio perche' ci sono 
gli undefined behaviour (parlando di C) e le implementazioni sbagliate o 
non ancora complete (capita oggigiorno con il C99 che non e' ancora 
pienamente supportato).
Non ci fare mai affidamento, fai affidamento a un buon libro (il che esclude 
i vari Schildt) o allo standard.


 non ricordo quale versione) non era noto neanche a te!
Nessuno si deve chiedere su che sistema stai programmando.
Il newsgroup parla di Linguaggio C:
"Il gruppo trattera` di qualsiasi dialetto del linguaggio C, in modo
particolare del vecchio K&R e di quello specificato dall'istituto
americano ANSI come standard "ANSI X3.159-1989" e ratificato
dall'istituto internazionale ISO come standard "ISO/IEC 9899:1990".
Le particolari implementazioni appartengono ad altri gruppi.
Se sullo standard c'è scritto che fflush(stdin) è undefined behaviour
fflush(stdin) è undefined behaviour.
Se poi volete per forza inserire un UB nel vostro codice fate pure, ma
forse dovete porre le vostre domande sui gruppi specifici del vostro
sistema operativo.
Ciao
