Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di hfish
    Registrato dal
    Dec 2000
    Messaggi
    3,180

    [c++] problema con strtok

    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

    codice:
    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

    codice:
    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?
    Non dobbiamo trascurare la probabilità che il costante inculcare la credenza in Dio nelle menti dei bambini possa produrre un effetto così forte e duraturo sui loro cervelli non ancora completamente sviluppati, da diventare per loro tanto difficile sbarazzarsene, quanto per una scimmia disfarsi della sua istintiva paura o ripugnanza del serpente.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Beh, se liberi la memoria dove c'è il dato, può capitare di tutto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di hfish
    Registrato dal
    Dec 2000
    Messaggi
    3,180
    e la soluzione è NON cancellare l'oggetto dinamico?
    Non dobbiamo trascurare la probabilità che il costante inculcare la credenza in Dio nelle menti dei bambini possa produrre un effetto così forte e duraturo sui loro cervelli non ancora completamente sviluppati, da diventare per loro tanto difficile sbarazzarsene, quanto per una scimmia disfarsi della sua istintiva paura o ripugnanza del serpente.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di hfish
    Registrato dal
    Dec 2000
    Messaggi
    3,180
    ma perchè cancellando tempBuff i valori di splitted[1|2|3] rimangono validi e scompare solo quello di splitted[0]?
    Non dobbiamo trascurare la probabilità che il costante inculcare la credenza in Dio nelle menti dei bambini possa produrre un effetto così forte e duraturo sui loro cervelli non ancora completamente sviluppati, da diventare per loro tanto difficile sbarazzarsene, quanto per una scimmia disfarsi della sua istintiva paura o ripugnanza del serpente.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.