Lenguaje de programación C

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

17 horas hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

1 semana hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

1 semana hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

1 semana hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

1 semana hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

1 semana hace

Esta web usa cookies.