Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149

    [C/C++]strtok() e eval()

    salve,
    so che il titolo è un pò misterioso e la strtok() e eval() non hanno niente in comune, ma sono i problemi principali del mio programma.

    [list=1][*]strtok()
    ho scritto una funzione che presi in imput una stringa e i delimitatori scompatta la stringa data in un vettore di stringhe e ne ritorna il puntatore.
    codice:
    char** scompatta(char *buffer,char *delimiters) {
        char *sTemp;
        int index = 0;
        char **v;
             
        //utilizzo la funzione strtok che restituisce la stringa fino al delimitatore
        sTemp = (char*)strtok(buffer,delimiters);
        v = (char**)malloc(sizeof(char*));
        strcpy(v[index],sTemp);
        index++;
    
        //passo a strtok NULL come primo parametro così parsa la stringa che ha in "memoria"
        while((sTemp = (char*)strtok(NULL,delimiters)) != NULL) {
            v = (char**)realloc(v,(index+1)*sizeof(char*));
            strcpy(v[index],sTemp);
    	    index++;
        }
    
        return v;
    }
    il problema è che dopo averla eseguita correttamente il programma crasha.
    il main è il seguente
    codice:
    int main(void) {
        char **v;
        char str[] = "dim=2";
    
        v = scompatta(str,"=");
        printf("\n'%s' = '%s'",v[0],v[1]);
    
        return 0;
    }
    la stampa viene fatta correttamente ma dopo crasha...sapete spiegarmi il perchè?
    [*]eval()
    stavo cercando una funzione tipo eval() di PHP che dovrebbe valutare una stringa ed eseguirla come se fosse codice. questo mi risparmierebbe il processo di scompattamento della stringa in quanto le stringhe da me utilizzate fanno riferimento ad assegnamenti a variabili.
    codice:
        char str[] = "dim=2";
        int dim;
        eval(str);
        printf("dim = %d",dim);
    se esistesse qualcosa di simile sarebbe molto comodo(oppure qualche dritta sull'implementazione)[/list=1]
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  2. #2
    2) Non esiste una funzione come la eval, e in C/C++ non può esistere per definizione, dato che sono linguaggi compilati e non interpretati.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149
    2) ok, capito...peccato toccherà scompattare tutte le stringhe e fare gli assegnamenti manualmente

    1) qualche errore visibile immediatamente nel codice?
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  4. #4
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149
    ho risolto!!
    avevo dimenticato di allocare lo spazio per le stringhe all'interno del vettore (allocavo solo lo spazio per il puntatore).
    comunque ho aggiunto questa riga
    codice:
    v[index] = (char*)calloc(strlen(sTemp),sizeof(char));
    quindi la funzione completa è questa
    codice:
    char** scompatta(char *buffer,char *delimiters) {
        char *sTemp;
        char *sBuffer;
        int index = 0;
        char **v;
    
        sBuffer = strdup(buffer);
             
        //utilizzo la funzione strtok che restituisce la stringa fino al delimitatore
        sTemp = (char*)strtok(sBuffer,delimiters);
        v = (char**)malloc(sizeof(char*));
        v[index] = (char*)calloc(strlen(sTemp),sizeof(char));
        strcpy(v[index],sTemp);
        index++;
    
        //passo a strtok NULL come primo parametro così parsa la stringa che ha in "memoria"
        while((sTemp = (char*)strtok(NULL,delimiters)) != NULL) {
            v = (char**)realloc(v,(index+1)*sizeof(char*));
            v[index] = (char*)calloc(strlen(sTemp),sizeof(char));
            strcpy(v[index],sTemp);
    	    index++;
        }
        
        v = (char**)realloc(v,(index+1)*sizeof(char*));
        v[index] = NULL;
        
        free(sBuffer);
    
        return v;
    }
    ho anche aggiunto una funzione per liberare lo spazio usato dal vettore perchè altrimenti rimarrebbe allocato in memoria
    codice:
    void freeVett(char** v) {
        int k;
        
        for(k=0;v[k]!=NULL;k++)
            free(v[k]);
        
        free(v);
    }
    questa funzione deve essere richiamata quando il vettore non serve più (e prima della fine del programma )
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  5. #5
    Un consiglio: quando dellochi la memoria a cui punta ciascun puntatore, assegna al puntatore il valore NULL, così se per errore tenti di usarlo te ne accorgi subito (ottieni un SEGFAULT).
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.