|
|||||||
|
|
|
![]() |
|
|
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: 22:27.




















