PDA

Visualizza la versione completa : [C]Problema inserimento stringhe in lista


dennis87
01-08-2014, 01:21
Ciao a tutti, il mio problema è questo:
ho una struttura di stringhe così fatta

struct node{
char *command;
struct node* next;
struct node* prev;
};

struct list{
int count;
struct node* header;
struct node* tailer;
};

se dal main faccio

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.

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

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.

}

Scara95
01-08-2014, 09:16
Per le stringhe devi allocare la memoria e usare strcpy

dennis87
01-08-2014, 10:32
dici che nella funzione di insert devo usare
strcpy(list -> command, new_command); al posto di
new_node -> command = new_command;?
Ma l'allocazione di memoria non la faccio con
new_node = malloc(sizeof(struct node));

Scara95
01-08-2014, 12:17
dici che nella funzione di insert devo usare
strcpy(list -> command, new_command); al posto di
new_node -> command = new_command;?
Ma l'allocazione di memoria non la faccio con
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:
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)
//...
char command[256];
//...
strcpy(new_node->command, new_command);

Loading