Análisis de Técnicas para la Segmentación de Cadenas en C: strtok() y sscanf()

En el lenguaje C, la segmentación de cadenas de texto es una tarea común con diversas implementaciones. A continuación, se detallan algunos enfoques para lograr esta funcionaldiad.

1. Empleo de la Función strtok

La función strtok permite dividir una cadena en subcadenas basándose en un conjunto de delimitadores especificados. Su prototipo es el siguiente:

char *strtok(char *str, const char *delim);

A continuación, se presenta un ejemplo de cómo utilizar strtok para procesar una cadana:

#include <stdio.h>
#include <string.h>

int main() {
    char datosCadena[] = "ID123#NombreCompleto#Ciudad#Año2023#Planeta";
    const char delimitador[] = "#";
    char* fragmento;
    char* arrayFragmentos[10]; // Almacena punteros a los fragmentos

    // Obtener el primer fragmento
    fragmento = strtok(datosCadena, delimitador);
    arrayFragmentos[0] = fragmento;
    int indice = 1;

    // Procesar los fragmentos restantes
    while (fragmento != NULL) {
        printf("Fragmento: %s\n", fragmento);

        // Obtener el siguiente fragmento
        fragmento = strtok(NULL, delimitador);
        arrayFragmentos[indice] = fragmento;
        indice++;
    }

    // Mostrar el contenido del array de fragmentos
    for (int i = 0; i < 5; i++) {
        if (arrayFragmentos[i] != NULL) {
            printf("Array[%d] = %s\n", i, arrayFragmentos[i]);
        }
    }

    return 0;
}

Esta implementación descompone la cadena original usando el carácter '#' como separador. La primera llamada a strtok recibe la cadena a procesar y el delimitador. Las llamadas subsecuentes utilizan NULL como primer argumento para continuar la segmentación a partir del punto donde se detuvo la anterior. Los resultados son punteros a las subcadenas dentro de la memoria original.

2. Utilización de la Función sscanf con Expresiones Regulares

La función sscanf, en combinación con patrones de formato, ofrece una alternativa para extraer datos segmentados de una cadena.

#include <stdio.h>
#include <string.h>

int main() {
    char entradaTexto[] = "Valor1;Valor2;Valor3;ÚltimoValor";
    char bufferSegmento[50]; // Buffer para almacenar cada segmento extraído
    const char separador[] = ";";
    int posicionActual = 0; // Para rastrear la posición en la cadena

    // Ciclo para extraer segmentos hasta que sscanf falle
    while (sscanf(entradaTexto + posicionActual, "%[^;]%n", bufferSegmento, &posicionActual) == 1) {
        printf("Segmento extraído: %s\n", bufferSegmento);
        // Avanzar la posición para omitir el delimitador actual y los posibles espacios
        posicionActual += strspn(entradaTexto + posicionActual, separador);
    }

    return 0;
}

Este enfoque utiliza sscanf para leer caracteres hasta encontrar un delimitador (en este caso, ';'). El especificador de formato %[^;] lee cualquier carácter que no sea el delimitador, y %n registra cuántos caracteres se han leído, permitiendo al bucle avanzar correctamente en la cadena de entrada para la siguiente iteración.

3. Implementación de una Función de Segmentación Personalizada

Es posible encapsular la lógica de segmentación dentro de una función reutilizable, a menudo utilizando strtok internamante.

#include <stdio.h>
#include <string.h>

void procesarSegmentos(char *cadena, const char *delimitador) {
    char *segmento = strtok(cadena, delimitador);

    while (segmento != NULL) {
        printf("Procesando: %s\n", segmento);
        segmento = strtok(NULL, delimitador);
    }
}

int main() {
    char datos[] = "ElementoA,ElementoB,ElementoC";
    procesarSegmentos(datos, ",");

    return 0;
}

Esta estructura define una función procesarSegmentos que toma la cadena y el delimitador como argumentos. Internamente, utiliza strtok para iterar sobre los segmentos resultantes y realizar alguna acción con cada uno, como imprimirlo.

Etiquetas: strtok sscanf segmentacion de cadenas C

Publicado el 6-29 06:09