Cosa c'è di così sbagliato in questa acquisizione

di il
32 risposte

32 Risposte - Pagina 2

  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Ah c*** è vero sorry!! è che la malloc ancora non la so gestire in certe occasioni visto che in c++ usavo la new molto più comoda
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    broke31 ha scritto:


    ah c*** è vero sorry!! è che la malloc ancora non la so gestire in certe occasioni visto che in c++ usavo la new molto più comoda
    La new non è "molto" più comoda ... il concetto è lo stesso e la comodità non c'entra nulla.
    Bisogna solo capire bene a cosa servono le funzioni quando si usano.
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Non vorrei dire niente ma non mi funziona comunque
    
    int scelta;
        char *string;
        
        struct nodo *appoggio;
     
        appoggio=NULL;
        
        printf("1:inserisci\n");
        printf("2:cancella\n");
        scanf("%d",&scelta);
        
        
        if(scelta==1)
        {  string=malloc(20*sizeof(char*));
            printf("inserisci la stringa\n");
            scanf("%s",string);
      
    
    
    
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Continui con "non mi funziona" ... ma che vuol dire?
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    No ho risolto va in crash non per la scanf ma per la funzione che chiama subito dopo ovvero questa:

    
    
    void inserisci(char *stringa)
    {
        struct nodo *inizio,*nuovo;
        nuovo=(struct nodo*)malloc (sizeof (struct nodo));
        inizio=&lista;
         if(inizio->next==NULL)// ho 1 solo nodo
             stpcpy(inizio->info,stringa);
        
         else{
            while(inizio->next!=NULL)
            {
                inizio=inizio->next;// inizio++;
            
            }
         stpcpy(inizio->info,stringa);
        inizio->next=nuovo;
         }
    }
    
    
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Che chiami come?
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Forse è meglio che ti posto tutto il sorgente che è più leggibile xd
    
    
    struct nodo{
        char* info;
        struct nodo*next;
    }lista;
    
     int trovata_stringa=0;
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    void inserisci(char*);
    struct nodo* cancella(char*);
    
    
    int main()
    {
        int scelta;
        char *string;
        int o;
        struct nodo *appoggio;
     
        appoggio=NULL;
        
        printf("1:inserisci\n");
        printf("2:cancella\n");
        scanf("%d",&scelta);
        
        
        if(scelta==1)
        {  string=malloc(20*sizeof(char*));
            printf("inserisci la stringa\n");
            scanf("%s",string);
            scanf("%d",&o);
            inserisci(string);
        
        }
        
        if(scelta==2)
        {
            printf("inserisci la stringa da cancellare\n");
            scanf("%s",string);
            
            appoggio=cancella(string);
            if(trovata_stringa!=0)
            {
                printf("la stringa è stata cambiata\n");
                
            
            }
            else{
            
                printf(" non  è successo niente\n");
            
            }
        
        
        
        
        
        }
        
        
        return 0;
    }
    
    void inserisci(char *stringa)
    {
        struct nodo *inizio,*nuovo;
        nuovo=(struct nodo*)malloc (sizeof (struct nodo));
        nuovo->next=NULL;
        inizio=&lista;
         if(inizio->next==NULL)// ho 1 solo nodo
             stpcpy(inizio->info,stringa);
        
         else{
            while(inizio->next!=NULL)
            {
                inizio=inizio->next;// inizio++;
            
            }
         stpcpy(inizio->info,stringa);
        inizio->next=nuovo;
         }
    }
    
    
    
    struct nodo *cancella(char *string)
    {
        struct nodo* oldvalute;
        struct nodo *inizio;
        
        inizio=&lista;
        oldvalute=NULL;
        if(inizio==NULL)
            return (inizio);
        else
            while(inizio!=NULL){
          if(strcmp(inizio->info,string)==0)// se le 2 stringhe sono uguali
              if(oldvalute==NULL){
                  return inizio->next;
              }
                oldvalute=oldvalute->next;
                oldvalute->next=inizio->next;
                return inizio;
    
            }
        
        oldvalute=inizio;
        inizio=inizio->next;
        return inizio;
    
    }
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Il campo info all'interno della struttura è un semplice puntatore. Quando lo usi con una stpcpy devi assicurarti *prima* che lo spazio a cui punta sia allocato con una malloc.
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Quindi un controllo se inizio->info!=null ?
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Ho fatto l'allocamento della variabile inizio ma non è cambiato nulla
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    *mallocamento
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    broke31 ha scritto:


    ho fatto l'allocamento della variabile inizio ma non è cambiato nulla
    Come? Cosa hai scritto?
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    
    
    void inserisci(char *stringa)
    {
        struct nodo *inizio,*nuovo;
        inizio=(struct nodo*)malloc(sizeof(struct nodo));
        nuovo=(struct nodo*)malloc (sizeof (struct nodo));
      
        nuovo->next=NULL;
        inizio=&lista;
         if(inizio->next==NULL)// ho 1 solo nodo
             stpcpy(inizio->info,stringa);
        
         else{
            while(inizio->next!=NULL)
            {
                inizio=inizio->next;// inizio++;
            
            }
         stpcpy(inizio->info,stringa);
        inizio->next=nuovo;
         }
    }
    
    
    
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Guarda che ti avevo detto di allocare lo spazio per la stringa puntata da

    inizio->info

    e non mi pare ci siano malloc per inizio->info ...
  • Re: Cosa c'è di così sbagliato in questa acquisizione

    Esplode (va in crash) comunque
    questo è ricorretto con il tuo consiglio
    
    
    void inserisci(char *stringa)
    {
        struct nodo *inizio,*nuovo;
        inizio=(struct nodo*)malloc(sizeof(struct nodo));
        inizio->info=(char*)malloc(sizeof(char));
        nuovo=(struct nodo*)malloc (sizeof (struct nodo));
      
        nuovo->next=NULL;
        inizio=&lista;
         if(inizio->next==NULL)// ho 1 solo nodo
             stpcpy(inizio->info,stringa);
        
         else{
            while(inizio->next!=NULL)
            {
                inizio=inizio->next;// inizio++;
            
            }
         stpcpy(inizio->info,stringa);
        inizio->next=nuovo;
         }
    }
    
    visto che faccio tanti errori di malloc mi puoi spiegare brevemente come usarlo in maniera corretta ?
Devi accedere o registrarti per scrivere nel forum
32 risposte