Pagina 1 di 1

string tokenizer in c

Inviato: sab 24 giu 2006, 12:48
da whites11
ciao!
lo so che questo non è il miglior forum per parlare di programmazione, ma vi chiedo un aiutino lo stesso.
avrei bisogno di creare un tokenizer per splittare una stringa usando come delimitatori delle stringhe (e non singoli caratteri).
mi potete consigliare una libreria per poterlo fare senza scomodare le regexp?

grazie

Inviato: sab 24 giu 2006, 16:15
da Sari
prova a dare un'occhiata a Glib, magari c'e' qualcosa che fa al caso tuo.

http://developer.gnome.org/doc/API/2.0/glib/index.html

sopratutto la sezione

http://developer.gnome.org/doc/API/2.0/ ... tions.html

Inviato: sab 24 giu 2006, 16:25
da dapuzz
il classico normale strtok non fa al caso tuo? forse non ho capito bene :D

Inviato: sab 24 giu 2006, 16:41
da whites11
il classico normale strtok non fa al caso tuo? forse non ho capito bene
strtok può utilizzare solo caratteri come delimitatori per i token, mentre io ho bisogno di dividere usando stringhe!

Inviato: sab 24 giu 2006, 16:41
da whites11
Sari ha scritto:prova a dare un'occhiata a Glib, magari c'e' qualcosa che fa al caso tuo.

http://developer.gnome.org/doc/API/2.0/glib/index.html

sopratutto la sezione

http://developer.gnome.org/doc/API/2.0/ ... tions.html
grazie proverò a vedere!

EDIT: mi sa che ci hai preso in pieno! grandioso.
se serve a qualcun'altro la funzione è g_strsplit () che potete trovare a questo indirizzo:
http://developer.gnome.org/doc/API/2.0/ ... g-strsplit

Inviato: sab 24 giu 2006, 18:45
da elettronicha
whites11 ha scritto:
il classico normale strtok non fa al caso tuo? forse non ho capito bene
strtok può utilizzare solo caratteri come delimitatori per i token, mentre io ho bisogno di dividere usando stringhe!
e se lo usi in combinazione con "strstr"?

Inviato: lun 26 giu 2006, 13:17
da rogx
Senza resposabilita', prova:

Codice: Seleziona tutto

#include <stdio.h>
#include <strings.h>

int tokenizza(char *stringa, char delim[][10], int numdelim, char tokarray[][100])
{
int cnt1=0, cnt2=0; // contatori. 
int lunghstr=0;     // lunghezza della stringa passata
char *nuovastringa; // la stringa da analizzare si accorcia man mano che si scompone in tokens
char *iniziotoken;      // 
char *primoiniziotoken; // puntatori di lavoro usati nello scan della stringa passata
char *finetoken;        //
  
nuovastringa=stringa;
lunghstr=strlen(stringa);

while(1)
  {
  iniziotoken=0;primoiniziotoken=0;finetoken=0;
  for (cnt1=0;cnt1<numdelim;cnt1++) // questo ciclo trova la prima stringa delimitatrice tra quelle
    {                               // passate in delim[][10]
    printf("nuovastringa: %s  delim[%d]: %s\n", nuovastringa, cnt1, delim[cnt1]);
    iniziotoken = strstr (nuovastringa, delim[cnt1]); // verifica l'esistenza del delimitatore nella stringa
    if (iniziotoken )
      {
      if (primoiniziotoken)
        {
        if (iniziotoken < primoiniziotoken) // si accerta di trovare la prima occorrenza
          primoiniziotoken = iniziotoken;   // di una delle stringhe delimitatrici
        finetoken = primoiniziotoken + strlen(delim[cnt1]);
        }
      else
        {
        primoiniziotoken = iniziotoken;
        finetoken = primoiniziotoken + strlen(delim[cnt1]);
        }
      }/*** End if (primoiniziotoken) ***/
    }/*** End for(cnt1=0;cnt1<numdelim;cnt1++) ***/
    
  if (primoiniziotoken) // se e' stata trovata almeno una delimitazione
    {
    primoiniziotoken[0]=0;    // mette lo 0 di termine stringa dove inizia la delimitatrice
    if (strlen(nuovastringa)) // Se non e' una stringa vuota (nel caso la stringa da scomporre inizia con un delimitatore)
      {
      strcpy(tokarray[cnt2],nuovastringa); // copia la stringa nell'array di ritorno
      cnt2 ++;
      }
    nuovastringa=finetoken; // la nuova stringa da analizzare comincia dopo
    }/*** End if (iniziotoken) ***/                      // la fine del delimitatore
  else
    {
    if ((int)nuovastringa < ((int)stringa+lunghstr )) // controlla se c'e' rimasto qualche carattere utile
      {
      strcpy(tokarray[cnt2],nuovastringa);
      cnt2 ++;
      }
    return(cnt2);
    }/*** End else ***/
  }/*** End while(1) ***/
return(cnt2);
}

int main()
{
char strng[100];      // stringa da scomporre
char dlm[5][10];      // array con le stringhe delimitatrici
char tokarr[20][100]; // array per le sottostringhe trovate da tokenizza()
int numd=0;           // numero di stringhe delimitatrici
int numret=0;         // valore ritornato da tokenizza(), cioe' quanti tokens sono stati trovati
int cnt=0;            // contatore per il ciclo for che mostra i risultati

strcpy(strng,"Tanto va il gatto al lardo"); // esempio stringa da scomporre
strcpy(dlm[0],"to");  // Stringhe delimitatrici: "to"
strcpy(dlm[1],"ar");  // e "ar"
numd=2;               // Sono due

numret=tokenizza(strng, dlm, numd, tokarr); // chiamata alla sub

for(cnt=0;cnt<numret;cnt++)
  printf("token %d: #%s#\n",cnt,tokarr[cnt]);  // mostra il risultato

return(0);
}

Inviato: mar 27 giu 2006, 13:34
da whites11
Grazie mille per l'ottimo lavoro, lo proverò non appena possibile!

Inviato: mar 27 giu 2006, 16:39
da rogx
correzione:

la seconda riga:

Codice: Seleziona tutto

#include <strings.h>
in linux deve essere:

Codice: Seleziona tutto

#include <string.h>
e poi si puo' commentare o cancellare la riga 21:

Codice: Seleziona tutto

printf("nuovastringa: %s  delim[%d]: %s\n", nuovastringa, cnt1, delim[cnt1]);
(era usata per debugging).

Ciao