PDA

Visualizza la versione completa : [c++] problema con strtok


hfish
02-12-2011, 14:28
ho bisogno di una funzione che prenda in input un char* contenente un indirizzo ipv4 (192.168.27.35) e un vettore di quattro char* in cui inserire i quattro ottetti (192, 168, 27 e 35)

il comportamento di strtok è alquanto strano, in quanto modifica l'argomento che gli viene passato: non posso quindi usare strtok con il mio buffer di ingresso (toSplit), ma devo prima effettuarne una copia (tempBuffer) e quindi passare quest'ultima a strtok

il problema si crea quando cancella l'oggetto dinamico appena creato



void splitCharIpAddress (char* toSplit, char* splitted[4])
{
char* tempBuffer = new char[strlen (toSplit) + 1];
strcpy (tempBuffer, toSplit);

splitted[0] = strtok (tempBuffer, ".");
for (int i = 1; i < 4; i++)
splitted[i] = strtok (NULL, ".");

for (int i = 0; i < 4; i++)
cout << splitted[i] << " ";
cout << endl;

delete tempBuffer;

for (int i = 0; i < 4; i++)
cout << splitted[i] << " ";
}


da come output



192 168 0 1
168 0 1


ovvero il contenuto di splitted[0] viene perso non appena cancello tempBuffer.

è sicuramente un errore del cavolo, ma ci sto smattando da due ore e non ragiono con lucidità

qualcuno mi aiuta?

oregon
02-12-2011, 15:41
Beh, se liberi la memoria dove c'è il dato, può capitare di tutto ...

hfish
02-12-2011, 15:47
e la soluzione è NON cancellare l'oggetto dinamico?

oregon
02-12-2011, 16:07
Hai allocato e copiato una stringa tempBuffer a partire dalla stringa toSplit.

Poi, con la strok hai determinato 4 puntatori (i 4 elementi del vettore splitted) che evidentemente puntano a parti della stringa tempBuffer.

Se liberi la tempBuffer è ovvio che i 4 puntatori non puntano più a nulla di valido.

Le soluzioni sono

1) non liberi la tempBuffer finché ti serve (solo quando non ti serve più fai la free)

2) allochi 4 nuove stringhe e ci copi le 4 parti trovate; e puoi liberare la tempBuffer (ovviamente la questione si sposta sulle 4 stringhe allocate)

Non puoi lavorare solamente con puntatori ... devi avere i dati a cui puntano ...

hfish
02-12-2011, 16:10
ma perchè cancellando tempBuff i valori di splitted[1|2|3] rimangono validi e scompare solo quello di splitted[0]?

oregon
02-12-2011, 16:20
Quando liberi la memoria quello che succede al contenuto della memoria liberata non è prevedibile. Può essere lasciato immutato come può variare e dipende da come il sistema in quel momento sta gestendo la memoria.

Può capitare che, in un'altra occasione, tu veda altro, io, nel mio sistema ho altri comportamenti.

Loading