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
Inviato: sab 24 giu 2006, 16:25
da dapuzz
il classico normale strtok non fa al caso tuo? forse non ho capito bene

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
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:
in linux deve essere:
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