Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185

    [C]Problema inserimento stringhe in lista

    Ciao a tutti, il mio problema è questo:
    ho una struttura di stringhe così fatta
    codice:
    struct node{
        char *command;
        struct node* next;
        struct node* prev;
    };
    
    struct list{
        int count;
        struct node* header;
        struct node* tailer;
    };
    se dal main faccio
    codice:
    fgets(command, 255, stdin);
    insert(mylist, command);
    viene inserito correttamente, e quando stampo la lista, si vede ciò che ho inserito, se invece racchiudo i due comandi in un ciclo do-while, sembra che tutto funzioni, ma quando stampo la lista non c'è nulla.
    codice:
    do{
            printf("\nComando -> ");        
            fgets(command, 255, stdin);
            
            if(strcmp(command, "\n")!=0){
                strtok(command, "\n");
                sprintf(command, "%s > out.%d", command, i); i++;
                insert(mylist, command);
                printf("inserito!\n");
            }
            
        }while(strcmp(command, "\n")!=0);
    Non mi spiego il perchè.
    Grazie mille a tutti

    EDIT: la funzione insert è questa
    codice:
    void insert(struct list* list, char* new_command){
        struct node* new_node;    
        new_node = malloc(sizeof(struct node));
        //int i=1;
        //sprintf(new_command, "%s > out.%d",new_command, i);
    
        new_node -> command = new_command;
        new_node -> next = NULL;
    
        if(list -> count == 0){ //se la lista è vuota il nuovo nodo è sia header che tailer
            new_node -> prev = NULL;
            list -> header = list -> tailer = new_node;
        }else{ //se la lista contiene già un elemento aggancio il nuovo nodo alla fine della lista
            // dopo l'inserimento, il nuovo nodo sarà quindi il tailer della lista.
            new_node -> prev = list -> tailer;
            list -> tailer -> next = new_node;
            list -> tailer = new_node;
        }
    
        list -> count ++; // aumento il contatore dei nodi della lista.
    
    }
    Ultima modifica di dennis87; 01-08-2014 a 01:24

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Per le stringhe devi allocare la memoria e usare strcpy
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    185
    dici che nella funzione di insert devo usare
    codice:
     strcpy(list -> command, new_command);
    al posto di
    codice:
    new_node -> command = new_command;
    ?
    Ma l'allocazione di memoria non la faccio con
    codice:
    new_node = malloc(sizeof(struct node));

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da dennis87 Visualizza il messaggio
    dici che nella funzione di insert devo usare
    codice:
     strcpy(list -> command, new_command);
    al posto di
    codice:
    new_node -> command = new_command;
    ?
    Ma l'allocazione di memoria non la faccio con
    codice:
    new_node = malloc(sizeof(struct node));
    E' dichiarato come char *command; non hai memoria allocata per i caratteri della stringa, solo per contenere un indirizzo di memoria.
    Puoi risolvere in 2 modi:
    codice:
    new_node->command = (char *)malloc(sizeof(char)*(strlen(new_command)+1));//+1 per il terminatore '\0'
    strcpy(new_node->command, new_command);
    oppure cambiando la dichiarazione (più efficiente, ma devi essere sicuro della lunghezza massima)
    codice:
    //...
      char command[256];
    //...
    strcpy(new_node->command, new_command);
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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 © 2024 vBulletin Solutions, Inc. All rights reserved.