Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49

    [C] Stringhe dinamiche ed array di stringhe dinamico

    Ciao a tutti,
    vorrei porre alla vostra attenzione il seguente programma da me realizzato. Il programma è funzionante, tuttavia vorrei avere un vostro parere a riguardo ed eventuali suggerimenti per migliorarlo.
    Grazie

    codice:
    //  Programma che richiede all'utente di inserire un numero indefinito di nomi.
    //  Ogni nome viene memorizzato dinamicamente in una stringa.
    //  I nomi vengono memorizzati dinamicamente in un array di stringhe.
    //  L'inserimento termina quando l'utente digita la parola "exit" sulla linea di comando.
    //  Terminato l'inserimento il programma prevede a presentare sullo schermo i nomi inseriti.
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef enum {FALSO, VERO} boolean;
    
    main()
    {
     char* pnome;
     char** plista;
     char c;
     
     boolean insertion, end;
     int n_nomi = 0;
     int n_caratteri = 0;
     int k = 0;
     int tot_mem = 0;
     
     end = FALSO;
     
     while(!end)
     {
      printf("\nInserire un nome o digitare 'exit' per uscire: ");
      insertion = VERO;
      
      while(insertion)
      {       
       c=getchar();
       
       if(n_caratteri==0)
       {
        if(c=='\n')
        {
         insertion=FALSO;
        }
        else if(c!='\n')
        {
         n_caratteri=2;
         pnome=(char*)malloc(2);
         if(pnome==NULL)
         {
          printf("Memoria insufficiente\n");    
          insertion==FALSO;
         }
         pnome[0]=c;
         pnome[1]='\0';
        }
       }
       else if(n_caratteri!=0)
       {
        if(c=='\n')
        {
         if(strcmp(pnome,"exit")==0)
         {
          insertion=FALSO;
          end=VERO;
         }
         else if(strcmp(pnome,"exit")!=0)
         {
          if(n_nomi==0)
          {
           n_nomi=1;
           plista[n_nomi-1]=(char*)malloc(n_caratteri);
           strcpy(plista[n_nomi-1],pnome);
           printf("Il nome inserito e': %s\nMemoria allocata %d byte\n",plista[n_nomi-1],n_caratteri);
          }  
          else if(n_nomi!=0)
          {
           n_nomi++;
           plista[n_nomi-1]=(char*)malloc(n_caratteri);
           strcpy(plista[n_nomi-1],pnome);
           printf("Il nome inserito e': %s\nMemoria allocata %d byte\n",plista[n_nomi-1],n_caratteri);
          }
          insertion=FALSO;
          n_caratteri=0;
          free(pnome);
         }
        }
        else if(c!='\n')
        {
         n_caratteri++; 
         pnome=(char*)realloc(pnome,n_caratteri);
         if(pnome==NULL)
         {
          printf("Memoria insufficiente a contenere tutto il nome\n");
          insertion==FALSO;
         }
         pnome[n_caratteri-2]=c;
         pnome[n_caratteri-1]='\0';
        }
       }
      }
     }
     printf("\nLista nomi:\n");
     for(k=0;k<n_nomi;k++)
     {
      printf("\t%s\n",plista[k]);
      tot_mem=tot_mem+(strlen(plista[k])+1);
     }
     printf("\nTotale memoria allocata: %d\n",tot_mem);
     printf("\nProgramma terminato dall'utente.\n");
    }

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    bhà...il codice potrebbe sembrare corretto, anche se, io onestamente non sono daccordo su alcune cose:
    1) la variabile plista è di tipo char**, quindi andrebbe allocata 2 volte, e non sono sicuro se si possa fare:
    codice:
    plista[n_nomi-1]=(char*)malloc(n_caratteri);
    cioè prima di scrivere plista[n_nomi-1], devi allorare plista, perchè non sai mica a priori di quanto è!
    poi d'altro canto sarebbe più corretto scrivere:
    codice:
    plista[n_nomi-1]=(char*)malloc(n_caratteri*sizeof(char));
    perchè bisogna sempre specificare il tipo, il questo caso si tratta di char, e quindi non influenza, poichè sizeof(char)=1...quindi...si ha che è uguale a n_caratteri! lo stesso vale nella printf successiva! andrebbe stampato sizeof(char)*n_caratteri!
    spero di essere stato chiaro, comunque se hai dubbi chiedi che ne parliamo...
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

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.