25 octubre 2005

Uso de strtok()

strtok() es una función de C que permite partir una cadena en subcadenas usando como separador los caracteres que queramos.

Supongamos que tenemos una cadena con una frase y queremos separarla en palabras. Como separador de palabras usaremos los espacios, comas, dos puntos, punto y comas y puntos.

Lo primero es hacer una copia de nuestra cadena original, puesto que la función strtok() la estropea (va reemplazando separadores por caracteres \0). Para la copia podemos usar strdup(), que creo que es propia de C en unix o bien strcpy() que sí es standard.

Para obtener el primer token (la primera palabra), hay que llamar a strtok() pasando como parámetros la cadena que queremos analizar (la copia) y una cadena con los caracteres separadores

char *primeraPalabra = strtok(cadena, " .,;:");

Si primeraPalabra es NULL, no hay palabras en la cadena. A partir de aqui, para que nos devuelva los siguientes tokens (palabras) hay que llamar a la misma función, pero pasando NULL como primer parámetro. La función recuerda la cadena y la última palabra que devolvió y continua con la siguiente.

Lo mejor es meter todo en un bucle

char *token = primeraPalabra;
while (token != NULL)
{
token = strtok (NULL; " .,;:");
// token es ahora la siguiente palabra o NULL. Aqui debemos guardarla en algún sitio,
// escribirla en pantalla o lo que queramos.
}

Precisamente por recordar strtok() su estado en sucesivas llamadas, no es una función segura para usar con hilos. Lo que hace un hilo con ella puede estropear lo que hace el otro. Tampoco podemos dentro de un mismo hilo ir analizando dos cadenas distintas en paralelo. Habría que analizar completamente una y luego la otra.

No hay comentarios: