Posted on abril 28, 2024
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](https://blog.iglesias.dev.br/wp-content/uploads/2024/04/image.png)
Caso tenha alguma idéia para melhorar o código, pode deixar aqui nos comentários!