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.
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.
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
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.
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);
}
}
}
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.
En este post te quiero compartir un código de C++ para listar y cancelar trabajos…
Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…
Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…
Esta semana estuve recreando la API del plugin para impresoras térmicas en Android (HTTP a…
Hoy te enseñaré a extraer la cadena base64 de una clave PEM usando una función…
Encender un foco con un Bot de Telegram es posible usando una tarjeta como la…
Esta web usa cookies.