Código executável completo demonstrando funções de manipulação de strings da <string.h>, formatação segura com snprintf e proteção contra injeções de Format String.


📄 Exemplo 1: Manipulação Segura com snprintf e strncmp (strings_seguras.c)

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

int main(void) {
    char bufferLog[128];
    const char *servico = "AuthService";
    const char *status = "200_OK";
    int tempoMs = 14;

    printf("====================================================\n");
    printf(" 🛡️ CONSTRUCAO SEGURA DE LOGS (SNPRINTF)\n");
    printf("====================================================\n");

    // 1. Formatação com garantia estrita de limites
    int bytesEscritos = snprintf(bufferLog, sizeof(bufferLog), 
                                 "[%s] Status: %s | Latencia: %d ms", 
                                 servico, status, tempoMs);

    printf("Log Gerado:     %s\n", bufferLog);
    printf("Bytes Escritos: %d (Capacidade: %zu bytes)\n", bytesEscritos, sizeof(bufferLog));

    // 2. Comparação segura com limite de caracteres
    if (strncmp(status, "200_OK", 6) == 0) {
        printf(">> Transacao Concluida com Sucesso! ✅\n");
    } else {
        printf(">> Falha na Transacao! ❌\n");
    }

    printf("====================================================\n");
    return 0;
}

📄 Exemplo 2: Tokenização Segura de String com strtok_r (parser_csv.c)

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

int main(void) {
    // String mutável na Stack contendo registro CSV
    char linhaCsv[] = "SENSOR_TEMP_01,24.85,OPERACIONAL,PISO_2";
    char *salvarPonteiro = NULL;

    printf("====================================================\n");
    printf(" 📄 PARSER CSV SEGURO E REENTRANTE (STRTOK_R)\n");
    printf(" Linha Original: \"%s\"\n", linhaCsv);
    printf("----------------------------------------------------\n");

    // Extrai o primeiro token
    char *token = strtok_r(linhaCsv, ",", &salvarPonteiro);
    int campo = 1;

    while (token != NULL) {
        printf(" Campo #%d: %s\n", campo++, token);
        // Próximos tokens passam NULL no primeiro argumento
        token = strtok_r(NULL, ",", &salvarPonteiro);
    }

    printf("====================================================\n");
    return 0;
}