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.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.