30 mar. 2012

Programación en C - Función strtok, una forma fácil de parsear una cadena de texto (string)

Hola a todos, en esta ocasión les presento una función para facilitar el parseo de una cadena de texto (string de aquí en más) en el lenguaje de Programación C estructurado.

En el uso de este lenguaje de programación, es muy típico encontrarse con la necesidad de dividir los campos de un string, los cuales están divididos por algún separador predeterminado, entre los más comunes pueden ser: “;” “-“ “:”, o cualquier otro, por esto una función que nos sería útil es strtok. Esta función recibe 2 parámetros, un string y un separador:



Y devuelve un puntero a char. En la primera llamada a la función, esta espera un string a ser parseado como primer parámetro, y un delimitador (o token) como segundo parámetro. Por ejemplo:

Otra opción sería:


Luego de la primera llamada a la función, esta espera como primer parámetro un NULL, y como segundo parámetro un delimitador (o token). Por ejemplo:

Otra opción sería:


Esto se debe a que esta función “conserva” el string que esta parseando, y en cada llamado pasa al siguiente campo. Para que quede más claro hagamos un ejemplo bien simple:

Existiendo un archivo llamado “miArchivo.txt” con el formato: Nombre;Apellido;Telefono;Edad;Apodo. Imprimir por pantalla: Nombre, Apellido, Teléfono, Edad, Apodo de todos los registros existentes en el archivo. El contenido de “miArchivo.txt” es el siguiente:

Dario;Argies;1785-2451;23;Daro
Juan;De las Nieves;7890-4451;45;Juancho
Jose Maria;Nubes;15-9855-4552;19;Josema
Florencia;Torres;0115799405;27;Flor

Manos a la obra, el código completamente funcional para solucionar este ejemplo seria:


El resultado de la ejecución de este programa es el siguiente:



Como podemos observar, el parseo fue realizado de forma correcta, con simplemente una línea de código por cada campo a ser parseado, esto demuestra la gran utilidad de esta función. En el caso que estés desarrollando un proceso con Hilos de ejecución (Threads), deberías buscar información sobre la función strtok_r, ya que strtok presenta problemas en este caso.

Esto es todo por hoy, cualquier duda/pregunta en los comentarios :)

Saludos!

-----
Argies_Dario

Compilado con: Microsoft Visual Studio 2008
Sistema Operativo: Windows 7

Fuentes:
Librería strtok

5 comentarios:

  1. Hola biuenas tardes
    estoy usando el strtok tal cual como esta arriba pero me bota violacion de segmento al hacer el strcpy
    porque sucede esto ?

    gracias

    ResponderEliminar
    Respuestas
    1. Te respondi en el otro post sobre tu posible problema. Pero tambien recorda que Linux tiene un salto de linea diferente al de Windows, y este ejemplo fue hecho con:

      Compilado con: Microsoft Visual Studio 2008
      Sistema Operativo: Windows 7

      Asi que deberias armar distinto los vectores para que detecte correctamente el salto de linea, que es el limite que debe leer de cada linea. Puede que sea parte del error que te da

      Repito: Es mas facil que arranques un ejemplo desde cero basandote en este, y no intentar hacerlo funcionar porque hay muchas diferencias de sistema operativo y de compilador

      Saludos

      Eliminar
  2. Intente compilar el codigo en linux pero arroja muchos errores

    ResponderEliminar
    Respuestas
    1. Hola!

      Creo que los 2 comentarios son tuyos por la diferencia de hora, asi que respondo sobre este: Si compilaste el codigo tal cual en Linux vas a tener fallas, ya que la funcion system (aparece en varias lineas como system ("PAUSE")) es una funcion de Windows, yo la uso para detener el programa y poder observar los resultados.

      Si vas a compilarlo en Linux para empezar deberias quitar estas lineas, y luego ver mejor el error que comentas sobre la violacion al segmento al hacer strcpy.

      Recorda que en el post dice que este ejemplo esta hecho sobre:

      Compilado con: Microsoft Visual Studio 2008
      Sistema Operativo: Windows 7

      Asi que al cambiar de sistema operativo y obviamente de compilador pueden cambiar muchas cosas, te diria que arranques un ejemplo desde cero usando este ejercicio como guia y no intentar hacerlo andar exactamente como aca porque va a dar problemas

      Saludos!

      Eliminar
  3. hola. Es los mismo hacer char* n = "hola mundo", que char n[] = "hola mundo" . Cuando le paso el parametro a strtok, como char* me tira violacion de segmento, Y si lo hago como vector efectua la operacion.

    Robert,

    ResponderEliminar

Dejanos tu comentario sobre esta nota