Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di Cr4ckz!
    Registrato dal
    Aug 2003
    Messaggi
    163

    [C] problema con array di stringhe dinamiche e tokenizer

    Ciao a tutti, sto avendo problemi a realizzare una funzione che, data in input una stringa e un carattere di escape, mi esegue la "tokenizzazione" della stringa e mi inserisca ogni token all'interno di un array di stringhe che verrà restituito in output.

    ecco il codice:

    codice:
    char **token(char *stringa, char *escape, int *count){
      char **out = NULL, *str;
      int fine = 1, i=0, j;
      
      out = (char **)malloc(sizeof(char **));
      str = strtok(stringa, escape);
      out[i] = (char *)malloc((strlen(str)+1)*sizeof(char *));
      strcpy(out[i],str);
    
      while(fine){
        str = strtok(NULL, escape);
        if(str != NULL){
          out = (char **)realloc(out, ++i*sizeof(char **));
          out[i] = (char *)malloc((strlen(str)+1)*sizeof(char *));
          strcpy(out[i],str);
        }else{
          fine = 0;
        }
      }
    
      *count = i+1;
      for(j=0; j<*count; j++){
        printf("\n%d: '%s'",j,out[j]); 
      }
    }
    ecco l'esecuzione con tre token (e funziona correttamente):
    codice:
    # A primo | secondo | terzo |   
    
    0: 'primo '
    1: ' secondo '
    2: ' terzo '
    ed ecco cosa succede se inserisco 4 o più token:
    codice:
    # A primo | secondo | terzo | quarto |
    
    0: 'primo '
    1: ' secondo '
    Segmentation fault
    qualche idea?

    grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C] problema con array di stringhe dinamiche e tokenizer

    codice:
      char **token(char *stringa, char *escape, int *count){
    La funzione richiede la restituzione di un puntatore doppio ma, allo stato attuale, non restituisce nulla (dovrà restituire out ?)

    In rosso le modifiche

    codice:
      out = (char **)malloc(sizeof(char *));
    codice:
      out[i] = (char *)malloc((strlen(str)+1)*sizeof(char));
    codice:
      while(fine){
        str = strtok(NULL, escape);
        if(str != NULL){
           // DA ELIMINARE out = (char **)realloc(out, ++i*sizeof(char **));
          i++;
          out[i] = (char *)malloc((strlen(str)+1)*sizeof(char));
          strcpy(out[i],str);
        }else{
          fine = 0;
        }
      }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    ciao sono un ragazzo che ha lo stesso problema....ascolta ho aggiustato le parti che hai riportato nella tua risposta ma ora si è presentato un altro problema:
    fin a quando inserisco massimo 4 stringhe tutto funziona, appena inserisco piu' di 4 stringhe l'output restituito mi va a modificare solamente il contenuto di out[0]...come mai?

    es:
    inserisco 5 caratteri : A a | b | c | d | e |

    posizione out:
    0 ---> '?!3' (non restituisce a)
    1 ---> 'b'
    2 ---> 'c'
    3 ---> 'd'
    4 ---> 'e'

    dove sbaglio?.....mi spiace ma sto usando il cellulare e non posso mettere il codice sorgente
    grazie in anticipo

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da albymotard
    ciao sono un ragazzo che ha lo stesso problema....
    Non devi inserirti in un thread, anche se hai lo stesso tipo di codice.

    Altrimenti non si può seguire nè te nè chi ha aperto in origine questo thread.

    Quindi, apri un tuo nuovo thread e, soprattutto, posta il codice altrimenti non si può neanche rispondere.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    Hai ragione, scusami , non mi sono spiegato.
    Il primo post e' stato inserito da un mio compagno, stiamo lavorando tutti e 2 allo stesso progetto. Il codice e' lo stesso soltanto che non potendo rispondere ho continuato io la discussione nel thread. Oggi pomeriggio c'abbiamo sbattuto la testa tutto il pomeriggio ma niente da fare, l'output era sempre sbagliato.
    Comunque ,come ti dicevo ,ho aggiustato la parte che mi hai fatto vedere difatti adesso riesco ad inserire piu' stringe (senza avere errori di segmentazione) solo che si presenta un ulteriore problema quando vado ad inserire un input di superiore a 4 stringhe: (ecco l'input con relativo output):

    A ciao | pippo | pluto | cane | gatto

    0: '�@� '
    1: ' pippo '
    2: ' pluto '
    3: ' cane '
    4: ' gatto'

    Come vedi in posizione out[0] viene modificato il contenuto.
    Se inserisco un input di 4 stringhe ottengo un risultato esatto:

    A ciao | pippo | pluto | cane |

    0: 'ciao '
    1: ' pippo '
    2: ' pluto '
    3: ' cane '

    Puoi spegarmi dov'e' il problema?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Mostra il codice che utilizzi attualmente (compreso il main che usi per inserire la stringa e chiamare la funzione)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    ok....domani ti sposto tutto..tanto sono poche righe di codice...purtroppo non ho il mio pc dietro ed essendo in panico e' tutto il pomeriggio che continuo a controllare il thread...ti ringrazio in anticipo per la tua disponibilita'

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    Vi posto il codice del programmino che stavo realizzando.Il problema e' quello che spiegavo ieri sera.
    Questo programma manipola stringhe, in questo caso prende in input una stringa conteneti delle pipe (caso A dello switch)
    Inserimento input :
    A cane | gatto | pippo | pluto |

    Deve restituire tutte le parole che sono divise da pipe :
    Output :
    0: 'cane '
    1: ' gatto '
    2: ' pippo '
    3: ' pluto '

    Il problema si presenta quando inserisco un input contenete più di 4 stringhe divise da pipe (va a modificare il contenuto nella posizione 0) es:

    inserendo : A cane | gatto | pippo | pluto | topolino | ottengo:

    0: 'X�d '
    1: ' gatto '
    2: ' pippo '
    3: ' pluto '
    4: ' topolino'

    vorrei sapere come mai viene modificato quel valore.

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    
    /*Legge da std input e salva in un'unica stringa*/
    char *read_word(){
      int i = 0;
      char c;
      char *string = NULL;
    
      c = getchar();
      while (c != '\n'){
        c = getchar();
        string = realloc(string, ++i*sizeof(char)); 
        string[i-1]=c;
      }
      string[i-1]='\0';
    
      return string;
    }
    
    /*elimina dalla stringa il carattere "escape" passato alla funzione */
    char **token(char *stringa, char *escape, int *count){
      char **out = NULL, *str;
      int fine = 1, i=0, j;
      
      out = (char **)malloc(sizeof(char *));
      str = strtok(stringa, escape);
      out[i] = (char *)malloc((strlen(str)+1)*sizeof(char));
      strcpy(out[i],str);
    
      while(fine){
        str = strtok(NULL, escape);
        if(str != NULL){
          i++;
          out[i] = (char *)malloc((strlen(str)+1)*sizeof(char));
          strcpy(out[i],str);
        }else{
          fine = 0;
        }
      }
    
      *count = i+1;
      for(j=0; j<*count; j++){
        printf("\n%d: '%s'",j,out[j]); 
      }
    
    }
    /* main */
    
    int main(){
      char c,*input,**sezioni,**nomi_autori, **citazioni;
      int i,count;
     
    
      while((c=getchar())!='f'){
        if(c!='\n'){
          switch(c){ 
    	/**CASO A**/
          case 'A':
    	input = read_word();
    	sezioni = token(input, "|", &count);
    		}
    	}
    }
    
    }

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    A parte il fatto che, come vi avevo già detto, alla fine della funzione token manca una

    return out;

    il programma funziona ... ho provato il caso che mi hai indicato ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    106
    guarda scusami ma non mi funziona ancora....ho messo un return out (non mi ero accorto)...pero' continua a modificarmi l'rarray nella posizione 0...non riesco a trovare l'errore. Ho copiato e incollato quello che ti ho postato (quindi il codice e' lo stesso) eppure mi da ancora errore

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.