string tokenizer in c

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
whites11
Linux 4.x
Linux 4.x
Messaggi: 1147
Iscritto il: ven 30 set 2005, 13:54
Località: Udine

string tokenizer in c

Messaggio 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

Avatar utente
Sari
Linux 3.x
Linux 3.x
Messaggi: 584
Iscritto il: mer 16 feb 2005, 0:00
Slackware: 12.1
Kernel: 2.6.24
Desktop: Gnome
Località: Verona

Messaggio 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

Avatar utente
dapuzz
Linux 4.x
Linux 4.x
Messaggi: 1137
Iscritto il: mar 16 mag 2006, 11:09
Contatta:

Messaggio da dapuzz »

il classico normale strtok non fa al caso tuo? forse non ho capito bene :D

Avatar utente
whites11
Linux 4.x
Linux 4.x
Messaggi: 1147
Iscritto il: ven 30 set 2005, 13:54
Località: Udine

Messaggio 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!

Avatar utente
whites11
Linux 4.x
Linux 4.x
Messaggi: 1147
Iscritto il: ven 30 set 2005, 13:54
Località: Udine

Messaggio 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

Avatar utente
elettronicha
Master
Master
Messaggi: 1712
Iscritto il: mer 13 apr 2005, 0:00
Località: Torino
Contatta:

Messaggio 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"?

Avatar utente
rogx
Linux 0.x
Linux 0.x
Messaggi: 38
Iscritto il: lun 24 gen 2005, 0:00

Messaggio 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);
}

Avatar utente
whites11
Linux 4.x
Linux 4.x
Messaggi: 1147
Iscritto il: ven 30 set 2005, 13:54
Località: Udine

Messaggio da whites11 »

Grazie mille per l'ottimo lavoro, lo proverò non appena possibile!

Avatar utente
rogx
Linux 0.x
Linux 0.x
Messaggi: 38
Iscritto il: lun 24 gen 2005, 0:00

Messaggio 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

Rispondi