Separar cadena a partir de delimitadores en C con strtok

Resumen: en este post te mostraré a separar una cadena en subcadenas a partir de un delimitador, usando C y la función strtok; el equivalente a split en otros lenguajes.

Gracias a esto podríamos separar una cadena por comas, por puntos, por espacios, etcétera.

Dividir cadena en C por cada espacio, guión, coma, entre otros

En C no existe la función split como en otros lenguajes; en donde simplemente ponemos un delimitador y nos devuelve un arreglo; pero tenemos una función que incluso puede ser más poderosa.

Esta función de la que hablo (la cual se llama strtok) nos permitirá dividir una cadena usando un delimitador; por ejemplo una coma.

A partir de una cadena, podemos usar delimitadores para obtener tokens. Pongamos a la cadena “Hola, qué tal. Vamos a programar en C”; si la separamos usando el espacio, las comillas y los signos de puntuación obtendríamos las palabras limpias.

Por poner otro ejemplo, dada una lista delimitada por comas podemos obtener sus elementos. De “Juan,Pedro,María,Rosa” podemos obtener 4 nombres; usando la coma como delimitador.

La función strtok en C

Nota: si quieres la versión para C++ puedes verla aquí.

Esta función llamada strtok viene en string.h y toma dos argumentos; el primero indica la cadena que vamos a dividir (es importante saber que esta cadena será modificada, así que si queremos que se mantenga intacta debemos copiarla a otra variable) y el segundo indica una lista de delimitadores.

En la primera llamada le pasamos esos argumentos que digo, y devolverá el primer token. Veamos un simple ejemplo para no confundirnos:

#include <stdio.h>
#include <string.h>
 
int main(){
    char cadena[] = "Hola,mundo",
    delimitador[] = ",";
    char *token = strtok(cadena, delimitador);
    if(token != NULL){
        printf("Encontramos un token: %s", token);
    }
}

La salida es: Encontramos un token: Hola

Eso devolvió el primer token, y si queremos que siga avanzando entonces lo seguimos llamando. ¿cómo sabemos cuándo detenernos? muy fácil, cuando el token sea nulo o NULL.

Por cierto, si queremos que la función siga dividiendo nuestra cadena; en las siguientes llamadas a la misma no debemos pasarle la cadena (sino NULL), y también los delimitadores. Veamos este ejemplo que ahora sí imprime todos los tokens:

#include <stdio.h>
#include <string.h>
 
int main(){
    char cadena[] = "Hola,mundo,soy,una,cadena,separa,por,comas",
    delimitador[] = ",";
    char *token = strtok(cadena, delimitador);
    if(token != NULL){
        while(token != NULL){
            // Sólo en la primera pasamos la cadena; en las siguientes pasamos NULL
            printf("Token: %s\n", token);
            token = strtok(NULL, delimitador);
        }
    }
}

Hemos ampliado la cadena que vamos a dividir. Y vemos claramente que en las siguientes llamadas pasamos NULL como primer argumento. Al ejecutar el programa que divide cadenas, el resultado es:

Token: Hola
Token: mundo
Token: soy
Token: una
Token: cadena
Token: separa
Token: por
Token: comas

Usando más delimitadores

Recordemos que esta función acepta muchos delimitadores; por ello recibe un arreglo de caracteres. Así que aparte de las comas podemos usar una lista.

Aquí otro ejemplo de strtok en C:

#include <stdio.h>
#include <string.h>
 
int main(){
    char cadena[] = "Esto es un texto. Puede ir separado por puntos, espacios o comas.",
    delimitador[] = ",. ";
    char *token = strtok(cadena, delimitador);
    if(token != NULL){
        while(token != NULL){
            // Sólo en la primera pasamos la cadena; en las siguientes pasamos NULL
            printf("Token: %s\n", token);
            token = strtok(NULL, delimitador);
        }
    }
}

Estamos usando el poder de los delimitadores: ahora no solamente es una coma, también agregamos un punto y un espacio.

De esta manera, cada que strtok encuentre uno de esos delimitadores, devolverá un nuevo token; dividiendo así la cadena.

Dividir cadena por comas y saltos de línea o tabulaciones

Para terminar, quiero dejar claro que también podemos usar saltos de línea o tabulaciones como delimitadores para dividir una cadena en C.

Recordemos que un salto de línea se representa con \n y una tabulación con \t.

Debido a esto, podemos usarlos como delimitadores. Veamos un ejemplo para partir una cadena usando como delimitadores las nuevas líneas y tabulaciones.

/*
    Ejemplo 3 de strtok en C
    @author parzibyte
*/
#include <stdio.h>
#include <string.h>
 
int main(){
    char cadena[] = "Hola\nMundo\t\t\tSeparado\nPor\nSaltos y tabulaciones",
    delimitador[] = "\n\t";
    char *token = strtok(cadena, delimitador);
    if(token != NULL){
        while(token != NULL){
            // Sólo en la primera pasamos la cadena; en las siguientes pasamos NULL
            printf("Token: %s\n", token);
            token = strtok(NULL, delimitador);
        }
    }
}

Conclusión

Con esta función podemos dividir cadenas en subcadenas; e incluso puede ser más poderosa y eficaz que un simple split.

Esto podría servir para procesar palabras, valores separados por comas, mensajes y más cosas que tengan que ver con las cadenas.

Te invito a ver más tutoriales, algoritmos y ejercicios resueltos de C.

Cabe mencionar que como referencia tome esta página.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *