Puntatori

di il
3 risposte

Puntatori

Salve a tutti ho un problema con i puntatori, perchè su questo codice:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void menu();
char **newBook (int n);
void bookA (char **b, int p);

int i;

int main() {
   char **book, c;
   int n;
   int p = 0;
   
   menu();
   
   while (( c = getchar () ) != 'f' ){
      switch (c) {
         case 'b': 
            printf ("\nPosti: ");
            scanf ("%d", &n);
            book = newBook (n);
            menu();
         break;
         
         case '+': 
            bookA (book, p);
            //printf ("%c", book[p][0]);
            p++;
            system ("clear");
            menu();
         break;
      /*
         
         case ’-’: // - k --> cancel(k)
      
         break;
         
         case ’m’: // m from to ---> move from to
   
         break;
         
         case ’p’: // p ---> printBook()
      
         break;
      */
      }
   }
   
   return 0;
}

void menu() {
   system ("clear");
   printf ("b - New book\n");
   printf ("+ - Book\n");
   printf ("- - Cancel\n");
   printf ("m - Move\n");
   printf ("p - Print book\n");
   printf ("f - Quit\n");
   printf ("\nOperazione: ");
}

char **newBook (int n) {
   char **b;
   
   b = malloc (n * sizeof(char));
   
   for (i = 0; i < n; i++);
      b[i] = NULL;
   
   return b;
}

void bookA (char **b, int p) {
   char c;
   int n = 0, size = 1;
   
   printf ("\nNome: ");
   
   i = 0;
   b[p] = malloc (size * sizeof(char));
   while ((c = getchar())) {
      if (n >= size) {
         size++;
         b[p] = realloc (b[p], size);
      }
      
      if (c == '\n') {
         b[p][i] = '\0';
         break;      
      }
      b[p][i] = c;
      i++;
   }
}

dopo aver creato il book (selezione 'b') se vado ad aggiungere una prenotazione ( selezione '+') )
non mi entra neanche nel ciclo di acquisizione stringa e mi stampa 'b', che è il comando inserito precedentemente. E' due giorni che ci sbatto la testa

3 Risposte

  • Re: Puntatori

    Quando tu inserisci '+' in realtà sul stream è rimasto anche l'invio che hai dato per confermarlo quindi dentro la funzione bookA la prima cosa che fai è prendere sto '\n'.Ciò fa che il while esca subito perche viene raggiunto il break. Tutto questo si scopre faccendo il debug del codice. Mettendo un getchar() prima di chiamare bookA fa si che vnga eliminato il '\n' e la funzione è pronta a prendere il nome.
    
    case '+':
    			getchar();
                bookA (book, p);
                //printf ("%c", book[p][0]);
                p++;
                system ("cls");
                menu();
    
  • Re: Puntatori

    Grazie mille mi hai salvato ora funziona, non posso credere di aver perso 2 giorni su un getchar
  • Re: Puntatori

    Ciao a tutti, il programma è completo, ma ho due problemi:
    1. Quando creo por la prima volta il book (selezione 'b') nelle primi posti punta a roba strana (strano perchè tutta la struttura dati dovrebbe essere inizializzata a '\0', in newBook()).

    2. Quando creo per la seconda volta il book mi dà un errore che penso derivi dall'istruzione ( free(book) in case: 'b' . free(): invalid next size (fast)) ma non capisco il perchè...qualcuno saprebbe delucidarmi? Vi ringrazio in anticipo. Posto il codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void menu (int m);
    char **newBook (int n);
    void bookA (char **b, int n, int posto);
    void printBook (char **print, int n);
    void cancel (char **br, int toRemove, int n);
    void move (char **bm, int from, int to);
    
    int i;
    int controllo = 1;
    
    int main() {
       char **book, c;
       int n, add, toRemove, from, to;
       //int p = 0;
       
       menu (controllo);
       
       while (( c = getchar () ) != 'f' ){
          
          switch (c) {
             case 'b': 
                if (controllo == 2)
                   free (book);
                printf ("\nPosti: ");
                scanf ("%d", &n);
                book = newBook (n);
                controllo = 2;
                menu(controllo);
             break;
          
             case '+':
                printf ("\nPosto: ");
                scanf ("%d", &add);      
                 
                bookA (book, n, add);
                //printf ("%s", book[p]);
                //p++;
                //system ("clear");
                menu(controllo);
             break;
          
             case '-': 
                printf ("\nPosto da cancellare: ");
                scanf ("%d", &toRemove);
                cancel (book, toRemove, n);
                menu (controllo);
             break;
          
             case 'm':
                printf ("\nFrom....To: ");
                scanf ("%d %d", &from, &to);  
                move (book, from, to); 
                menu (controllo);
             break;
          
             case 'p': // p ---> printBook()
                printBook (book, n);
                menu (controllo);
             break;
         
          }
       }
       
       return 0;
    }
    
    
    void menu(int m) {
       system ("clear");
       switch (m) {
          case 1:
             printf ("b - New book\n");
             printf ("f - Quit\n");
          break;
          case 2:
             printf ("b - New book\n");
             printf ("+ - Book\n");
             printf ("- - Cancel\n");
             printf ("m - Move\n");
             printf ("p - Print book\n");
             printf ("f - Quit\n");
          break;
       }
       printf ("\nOperazione: ");
    }
    
    
    char **newBook (int n) {
       char **b;
       
       b = malloc (n * sizeof(char));
       
       for (i = 0; i < n; i++) {
          b[i] = malloc (sizeof(char));
          b[i][0] = '\0';
       }
       
       return b;
    }
    
    
    void bookA (char **b, int number, int posto) {
       char c;
       int n = 0, size = 2;
       
       if (posto < number) {
          if (b[posto][0] != '\0') {
             getchar();
             printf ("\nNon disponibile, premere INVIO ... \n");
             getchar();
          }
          else {
             getchar();
             printf ("\nNome: ");
             
             i = 0;
             b[posto] = malloc (size * sizeof(char));
             while ((c = getchar())) {
                if (n >= size) {
                   size++;
                   b[posto] = realloc (b[posto], size);
                }
                
                if (c == '\n') {
                   b[posto][i] = '\0';
                   break;      
                }
                b[posto][i] = c;
                i++;
             }
          }
       } else {
          getchar();
          printf ("\nPosto non disponibile, premere INVIO ...\n");
          getchar();
       }
    }
    
    
    void cancel (char **br, int toRemove, int n) {
       if (toRemove < n) {
          if (br[toRemove][0] != '\0') {   
             br[toRemove] = realloc (br[toRemove], 1);
             br[toRemove][0] = '\0';
          } else {
             getchar();
             printf ("Posto libero! Premere INVIO ...");
             getchar();
          }
       }
    }
    
    
    void move (char **bm, int from, int to) {
       int lunghezza;
       
       if (bm[from][0] == '\0') {
          getchar();
          printf ("\nPosto %d libero!", from);         
          getchar();
       } else {
          if (bm[to][0] == '\0') {
             lunghezza = strlen (bm[from]);
             bm[to] = realloc (bm[to], lunghezza+1);
             strcpy (bm[to], bm[from]);
             bm[from] = realloc (bm[from], 1);
             bm[from][0] = '\0';
             getchar();
             printf ("\n\n%s spostato dal posto %d al posto %d. Premere INVIO ...", bm[to], from, to);
             getchar();
          } else {
             getchar();
             printf ("\nPosto %d già occupato. Premere INVIO ...", to);
             getchar();
          }
       }
    }
    
    void printBook (char **print, int n) {
       system ("clear");
       for (i = 0; i < n; i++) {
          if (print[i][0] != '\0')
             printf ("\nPosto N° %d: %s", i, print[i]); 
       }
       getchar();
       printf ("\n\nPremere INVIO ...\n");
       getchar();
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte