|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
[C] Problema nel copiare una stringa
Ciao a tutti,
ho un problema e non riesco a venirne a capo. In un file di testo scritto da me ci sono dei nomi di syscall separati da una virgola. Io devo leggere questi nomi e poi fare dei controlli su una struttura. Questo è il codice: Codice:
Lista *ListSearchName(Lista *head, char *v) { char *temp = NULL; temp = malloc(strlen(v)-1); strncpy(temp, v, strlen(v)-1); printf("%s", temp); Lista *p = head; while (p != NULL) { if (strcmp(p->name, temp) == 0) { return p; } p = p->next; } return NULL; } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <a black list file>\n", argv[0]); exit(1); } if (parseFile()) { perror("Problem while parsing the file"); exit(1); } FILE *fp; fp = fopen(argv[1], "r"); if (fp == NULL) { perror("Error while opening the black list file\n"); exit(1); } char *name = NULL; int nread; size_t n = 0; Lista *p; char *temp = NULL; size_t len = 0; ssize_t read; while (((read = getdelim(&name, &len,',', fp)) != -1)) { p = ListSearchName(root, name); if (p != NULL) { p->bl = 1; } } fclose(fp); } Quando lancio il programma, la parola write viene processata bene e sullo schermo viene scritto esattamente write, però per le altre 2 succede una cosa strana. L'output è il seguente: L'ultimo e il penultimo sono assurdi e non riesco a capire il motivo per il quale appaiano quei caratteri... Help Please
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Immagina che la stringa sia lunga 10 caratteri (escluso il nullo, chiaramente). Tu allochi 9 byte e con strncpy copi esattamente 9 caratteri. E il nullo finale?? Non lo metti. Soluzione: alloca una dimensione di strlen(v)+1 e poi copia semplicemente con strcpy (tanto sei già sicuro della dimensione).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Allora ho modificato così:
Codice:
Lista *ListSearchName(Lista *head, char *v) { char *temp = NULL; temp = malloc(strlen(v)+1); strncpy(temp, v, strlen(v)-1); printf("%s\n", temp); Lista *p = head; while (p != NULL) { if (strcmp(p->name, temp) == 0) { return p; } p = p->next; } return NULL; } write readl_pwait linkP1 Grazie per la risposta comunque...
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Potresti fare: Codice:
int len = strlen(v); temp = malloc(len); strncpy(temp, v, len-1); temp[len-1] = '\0'; Codice:
int len = strlen(v); temp = calloc (len, 1); strncpy(temp, v, len-1);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Aug 2005
Città: Wien
Messaggi: 435
|
Grazie mille, ho risolto grazie al tuo aiuto.
Ciao e grazie mille ancora
__________________
"Sono 126 miglia per Chicago. Abbiamo il serbatoio pieno, mezzo pacchetto di sigarette, è buio, e portiamo tutt'e due gli occhiali da sole" |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:09.