PDA

View Full Version : [C] Problema nel copiare una stringa


magix2003
28-05-2007, 16:25
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:


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);
}


Il contenuto del file è questo:


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:

write
readl_pwait
linkP�

L'ultimo e il penultimo sono assurdi e non riesco a capire il motivo per il quale appaiano quei caratteri...


Help Please

andbin
28-05-2007, 16:40
Lista *ListSearchName(Lista *head, char *v) {
char *temp = NULL;
temp = malloc(strlen(v)-1);
strncpy(temp, v, strlen(v)-1);
Quello che non quadra il dimensionamento dell'area di memoria e la copia con strncpy.
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).

magix2003
28-05-2007, 17:17
Allora ho modificato così:

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;
}


Ho continuato a usare strncpy perché devo copiare tutta la stringa meno un carattere. Comunque il risultato è sempre lo stesso:
write
readl_pwait
linkP1

Grazie per la risposta comunque...

andbin
28-05-2007, 20:31
Allora ho modificato così:

Lista *ListSearchName(Lista *head, char *v) {
char *temp = NULL;
temp = malloc(strlen(v)+1);
strncpy(temp, v, strlen(v)-1);


Ho continuato a usare strncpy perché devo copiare tutta la stringa meno un carattere. Comunque il risultato è sempre lo stessoNon ci siamo comunque ... malloc non inizializza l'area e copiando un carattere in meno con strncpy il nullo non viene copiato.

Potresti fare:
int len = strlen(v);
temp = malloc(len);
strncpy(temp, v, len-1);
temp[len-1] = '\0';
oppure
int len = strlen(v);
temp = calloc (len, 1);
strncpy(temp, v, len-1);Nota che calloc azzera l'area, quindi il nullo c'è eccome!

magix2003
31-05-2007, 09:54
Grazie mille, ho risolto grazie al tuo aiuto.

Ciao e grazie mille ancora