Tokenization

Recentemente um amigo me fez um pequeno desafio, criar um programa em C que tivesse como entrada uma string(frase) e fizesse split dos espaços transformando cada palavra em um token, no final printar a quantidade de token encontrados e todos os tokens em sequência com seu respectivo tamanho.

Um dos requisitos principais é que os tokens sejam armazenados em uma array de tamanho dinamico.

E o codigo acabou ficando assim:

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

#define MAX_LENGTH 1024

typedef struct  {
    char **tokens;
    int size;
} Splited;

void initSplited(Splited *splited) {
    splited->tokens = malloc(0);
    splited->size = 0;
}

void freeSplited(Splited *splited) {
    for (int i = 0; i < splited->size; i++) {
        free(splited->tokens[i]);
    }
    free(splited->tokens);
}

void split(char *str, char *delim, Splited *splited) {
    char *tokens = strtok(str, delim);
    while(tokens != NULL) {
        splited->tokens = (char **)realloc(splited->tokens, (splited->size + 1) * sizeof(char *));
        if (splited->tokens == NULL) {
            printf("Memory allocation failed\n");
            exit(1);
        }

        splited->tokens[splited->size] = (char *)malloc(strlen(tokens) + 1);
        if (splited->tokens[splited->size] == NULL) {
            printf("Memory allocation failed\n");
            exit(1);
        }

        strcpy(splited->tokens[splited->size], tokens);

        splited->size++;
        tokens = strtok(NULL, delim);
    }

}

int main() {
    char buffer[MAX_LENGTH];
    Splited splited;
    initSplited(&splited);

    printf("Enter the text: ");
    fgets(buffer, MAX_LENGTH, stdin);

    split(buffer, " ", &splited);

    printf("Number of Tokens: %d\n", splited.size);
    for (int i = 0; i < splited.size; i++) {
        printf("Num: %d Len: %zu :: Value: %s\n", i + 1, strlen(splited.tokens[i])* sizeof(char), splited.tokens[i]);
    }
    freeSplited(&splited);

    return 0;
}

Como tem muito tempo que não leio nem escrevo nada em C, provavelmente tem muito a ser melhorado, mas o importante é que funcionou. 🙂

Imagem mostra a execução do programa em C com a entrada sendo uma query sql e a saida sendo uma sequancia de tokens

Caso tenha alguma idéia para melhorar o código, pode deixar aqui nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *