|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jul 2007
Messaggi: 9
|
[C] problema strcpy ??
sto scrivendo una libreria per un progetto. Questa libreria, sostanzialmente, è composta da un set di funzioni che servono a gestire una lista ordinata.
Ho una funzione, lmake, che crea un nodo di questa lista riempiendo opportunamente i vari campi. Andando a provare, con un banale programma, queste funzioni mi sono accorto che proprio la più insospettabile, lmake appunto, non funziona. O meglio non inizializza alcuni campi come dovrebbe. DEFINIZIONE NODO: struct lnode{ char name[MAXB]; char pass[MAXB]; char pid[MAXB]; int stat; struct pnode *pends; struct lnode *next; }; typedef struct lnode LNODE; LMAKE: LNODE *lmake(char *name,char *pass){ printf("%s %s\n",name,pass); LNODE *x=(LNODE *)malloc(sizeof(LNODE)); strcpy(x->name,name); strcpy(x->pass,name); strcpy(x->pid,""); x->stat=disconnesso; x->pends=NULL; x->next=NULL; printf("%s %s\n",x->name,x->pass); return x; } PROGRAMMA DI PROVA: int main(){ LNODE *n1,*n2,*n3; PNODE *t; char buff[MAXB]; n1=lmake("nino","123"); n2=lmake("mara","456"); n3=lmake("poppy","789"); scanf("%s",buff); return 0; } come si può vedere io mi faccio stampare, appena entra in lmake, i parametri che riceve (username e password). Mi faccio poi stampare i campi immediatamente prima che la funzione termini. L'output è assai strano: nino 123 nn n mara 456 mm m poppy 789 pp p in sostanza l'input è coerente, ma nel campo viene copiato qualcosa di diverso...e sono due ore che sbatto la testa su questo codice di 3 righe. Dopo un pò mi sono deciso a chiedere a chiunque abbia esperienza col C, perchè sicuro è una di quelle cazzate inumane che ignoro totalmente, e senza scusanti. Vi ringrazio comunque per l'attenzione, anche se avrete letto solo le prime 3 righe ![]() Ultima modifica di magagna : 12-07-2007 alle 15:38. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
A parte il fatto che copi il name nel campo pass. Ma per il resto quel pezzo di codice mi sembra corretto. Quanto vale MAXB?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jul 2007
Messaggi: 9
|
i due parametri di input della funzione, name e pass, vengono copiati rispettivamente in x->name e x->pass, o almeno questa sarebbe l'intenzione.
MAXB vale 15 |
![]() |
![]() |
![]() |
#4 |
Junior Member
Iscritto dal: Jul 2007
Messaggi: 9
|
ho compilato e provato sia con gcc sotto Ubuntu, che con Dev-C++ sotto Windows e l'output è lo stesso...
|
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jul 2007
Messaggi: 9
|
purtroppo sono una gran testa di C
avevi ragione a chiedermelo andbin, perchè ho sbagliato a scrivere MAXB. Io credevo fosse 15, in realtà avevo battuto solo 1. Mea Culpa! Ultima modifica di magagna : 12-07-2007 alle 15:53. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
un consiglio: butta via la strcpy e usa la strncpy:
strcnpy(x->name,name, sizeof(x->name)); strcpy(x->pass,pass, sizeof(x->pass)); /*strcnpy(x->pid,""); */ memset((void *) x->pid, 0, sizeof(x->pid)) il 3° parametro indica quanti caratteri al massimo copiare nel primo parametro se usi la strcpy e MAXDB è definito = 15, se io faccio una cosa del genere strcpy(x->name, "123456789123456789123456789") vai pure tranquillo che sporchi memoria col rischio di segmentation fault o bachi semi-impossibili da trovare ![]()
__________________
Ciao ciao cagnolino Billy ![]() ![]() ![]() MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Il consiglio è più che giusto ... però si dovrebbe copiare un carattere in meno e assicurarsi che ci sia sempre il nullo finale. malloc non azzera la memoria e facendo come hai detto tu è possibile che la stringa non sia null terminated.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
Codice:
Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it. No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num. ![]() al più si fa un bel memset della stringa e poi ci si copia dentro l'altra, mettendo sempre lo 0 alla fine: string[sizeof(string) - 1] = 0; ps: io non ho parlato di malloc ![]()
__________________
Ciao ciao cagnolino Billy ![]() ![]() ![]() MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Io mi riferivo al codice di magagna che usa malloc per allocare la struttura. Se avesse usato calloc, ad esempio, il blocco sarebbe azzerato e quindi basterebbe fare
strncpy(x->name, name, sizeof(x->name)-1);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
![]()
__________________
Ciao ciao cagnolino Billy ![]() ![]() ![]() MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
|
![]() |
![]() |
![]() |
#11 |
Junior Member
Iscritto dal: Jul 2007
Messaggi: 9
|
vi ringrazio per i suggerimenti, ragazzi
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:44.