Newsgroup: it.comp.lang.c
Titolo: Errore fscanf

Ho un problema con questo prog. In fase di compilazione tutto ok, solo che,
quando mi trovo a scegliere una qualsiasi delle 3 opzioni del secondo
switch, il prog
si blocca ed esce immediatamente. Se eseguo il debug, mi dà l'errore
"Program received SIGSEGV. Segmentation fault" nella riga che ho segnato.
Di seguito il codice:
#include <stdio.h>
struct menu {
char *pietanza;
int costo;
int scelta;
};
struct menu m;
struct menu vett1[1];
struct menu vett2[1];
struct menu vett3[1];
FILE *fPtr;
void DividiPietanze();
int main()
{
   int opz;
   printf ("Scegli cosa vuoi fare: \n1. Dividi le pietanze secondo il
tipo\n2. Genera i menu\'\nSCEGLI: ");
   scanf ("%d", &opz);
   switch (opz)
   {
      case 1:
      DividiPietanze();
      break;
      case 2:  /* Questa  per ora la devo ancora implementare */
      break;
   }
return 0;
}
void DividiPietanze()
{
   int opz2;
   if ((fPtr = fopen("pietanze.txt", "r")) == NULL)
   printf ("Errore durante l'apertura del file");
   else
   {
   while (1)
   {
   printf ("\nScegli i tipi di pietanze da visualizzare:\n1. PRIMI\n2.
SECONDI\n3. CONTORNI\nFai la scelta (-1 per uscire): ");
   scanf ("\n%d", &opz2);
   if (opz2 == -1)
   break;
   else
   {
     switch (opz2)
       {
          case 1:
          rewind(fPtr);
          while (!feof(fPtr))
          {
             fscanf (fPtr, "%s %d %d\n", m.pietanza, &m.costo, &m.scelta);
/* Quì dà l'errore */
             if (m.scelta == 1)
             {
             vett1[0].pietanza = m.pietanza;
             printf ("%s\n", vett1[0].pietanza);
             }
          }
          break;
          case 2:
          rewind(fPtr);
          while (!feof(fPtr))
          {
             fscanf (fPtr, "%s %d %d\n", m.pietanza, &m.costo, &m.scelta);
             if (m.scelta == 2)
             {
             vett2[0].pietanza = m.pietanza;
             printf ("%s\n", vett2[0].pietanza);
             }
          }
          break;
          case 3:
          rewind(fPtr);
          while (!feof(fPtr))
          {
             fscanf (fPtr, "%s %d %d\n", m.pietanza, &m.costo, &m.scelta);
             if (m.scelta == 3)
             {
             vett3[0].pietanza = m.pietanza;
             printf ("%s\n", vett3[0].pietanza);
             }
          }
          break;
       }
   }
   }
   }
    fclose(fPtr);
   }
Questo è il contenuto del file "pietanze.txt":
BucatiniAmatriciana 12 1
PatateForno 6 3
BraciolaMaiale 10 2
ArrostoVitello 15 2
InsalataMista 3 3
SpaghettiPomodoro 10 1
RisottoScampi 12 1
FritturaPesce 15 2
CicoriaRipassata 5 3
Grazie a tutti
Daniele

 /* Quì dà l'errore */
Per forza che ti da un errore: m.pietanza e' un puntatore, non un array. 
Tu non hai allocato spazio per mettere i dati che leggi - e quindi la 
fscanf li mette in una locazione di memoria a caso (dato che un valore 
non definito sara' quello che ti troverai dentro ad m.pietanza).
Studiati per bene array e puntatori.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://www.cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003

> "Program received SIGSEGV. Segmentation fault" nella riga che ho
segnato.
Non ho il tempo di guardare il codice ma ti dò un solo consiglio:
evita *scanf() come la morte.  Usa piuttosto fgets().
Spiegare il perché è troppo lungo, guarda nei vecchi messaggi.