Partie 6 - Chaînes de caractères - Applications pratiques

@joekakone

Joseph Konka @joekakone

03/03/2026 · 10 min

Mettez en pratique vos compétences sur les chaînes en C : détecteur universel de palindromes, analyseur statistique de texte et algorithme de chiffrement de César.

La manipulation de texte est au cœur des moteurs de recherche, des parsers de fichiers, des compilateurs et de la cryptographie. Cette section met en pratique les concepts de la Partie 6 à travers trois applications réelles et complètes : le détecteur universel de palindromes, l'analyseur statistique de texte et le système de chiffrement historique de César.


Problème 1 : Détecteur universel de Palindromes#

Énoncé#

Un palindrome est un mot ou une phrase qui se lit exactement de la même manière de gauche à droite et de droite à gauche (exemples : "kayak", "radar", "rotor").

Écrivez un programme qui : 1. Lit une chaîne de texte au clavier de manière sécurisée avec fgets(). 2. Implémente une fonction bool EstPalindrome(const char *chaine) qui teste si le mot est un palindrome en comparant les caractères symétriques du début et de la fin sans allouer de copie.

flowchart LR
    subgraph TestPalindrome ["Test pour 'RADAR'"]
        C1["Indice i=0 : 'R'"] <-->|Égalité ? OUI| C5["Indice j=4 : 'R'"]
        C2["Indice i=1 : 'A'"] <-->|Égalité ? OUI| C4["Indice j=3 : 'A'"]
        C3["Indice i=2 : 'D' (Centre)"]
    end

Solution complète en C#

palindrome.c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>

bool EstPalindrome(const char *str)
{
    if (str == NULL) return false;

    int gauche = 0;
    int droite = (int)strlen(str) - 1;

    while (gauche < droite)
    {
        // Comparaison insensible à la casse avec tolower()
        if (tolower((unsigned char)str[gauche]) != tolower((unsigned char)str[droite]))
        {
            return false; // Différence détectée : pas un palindrome
        }
        gauche++;
        droite--;
    }

    return true; // Tous les caractères symétriques correspondent
}

int main(void)
{
    char mot[50];

    printf("Entrez un mot a verifier : ");
    if (fgets(mot, sizeof(mot), stdin) != NULL)
    {
        // Remplacement du '\n' final
        mot[strcspn(mot, "\n")] = '\0';

        if (EstPalindrome(mot))
        {
            printf("Le mot \"%s\" est un PALINDROME parfait !\n", mot);
        }
        else
        {
            printf("Le mot \"%s\" N'EST PAS un palindrome.\n", mot);
        }
    }

    return 0;
}

Problème 2 : Analyseur statistique de texte#

Énoncé#

Concevez un outil d'analyse textuelle qui lit une phrase et calcule en un seul passage : - Le nombre total de voyelles (A, E, I, O, U, Y). - Le nombre total de consonnes. - Le nombre total de chiffres numériques (0-9). - Le nombre total de mots (séparés par un ou plusieurs espaces).

Solution complète en C#

analyseur_texte.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

void AnalyserTexte(const char *texte)
{
    int nb_voyelles = 0;
    int nb_consonnes = 0;
    int nb_chiffres = 0;
    int nb_mots = 0;
    bool dans_un_mot = false;

    for (int i = 0; texte[i] != '\0'; i++)
    {
        unsigned char c = (unsigned char)texte[i];

        // 1. Détection des chiffres
        if (isdigit(c))
        {
            nb_chiffres++;
        }
        // 2. Détection des lettres
        else if (isalpha(c))
        {
            char minuscule = (char)tolower(c);
            if (minuscule == 'a' || minuscule == 'e' || minuscule == 'i' ||
                minuscule == 'o' || minuscule == 'u' || minuscule == 'y')
            {
                nb_voyelles++;
            }
            else
            {
                nb_consonnes++;
            }
        }

        // 3. Détection et comptage des mots
        if (!isspace(c))
        {
            if (!dans_un_mot)
            {
                dans_un_mot = true;
                nb_mots++;
            }
        }
        else
        {
            dans_un_mot = false;
        }
    }

    printf("--- RAPPORT D'ANALYSE TEXTUELLE ---\n");
    printf("Nombre de mots      : %d\n", nb_mots);
    printf("Nombre de voyelles  : %d\n", nb_voyelles);
    printf("Nombre de consonnes : %d\n", nb_consonnes);
    printf("Nombre de chiffres  : %d\n", nb_chiffres);
    printf("------------------------------------\n");
}

int main(void)
{
    char phrase[] = "Le langage C a ete cree en 1972 par Dennis Ritchie.";

    printf("Texte analyse :\n\"%s\"\n\n", phrase);
    AnalyserTexte(phrase);

    return 0;
}

Problème 3 : Le Chiffrement de César#

Énoncé#

Le chiffrement de César est l'une des plus anciennes méthodes de cryptographie symétrique. Il consiste à décaler chaque lettre du message d'un nombre fixe \(K\) de rangs dans l'alphabet (par exemple, pour un décalage de \(K = 3\), 'A' devient 'D', 'B' devient 'E', ..., et 'Z' boucle sur 'C').

Implémentez : 1. void ChiffrerCesar(char *texte, int cle) : décale les lettres majuscules et minuscules en préservant les espaces et ponctuations. 2. void DechiffrerCesar(char *texte, int cle) : applique le décalage inverse.

\[\text{Lettre chiffrée} = (\text{Lettre} - 'A' + K) \pmod{26} + 'A'\]

Solution complète en C#

chiffre_cesar.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void ChiffrerCesar(char *texte, int cle)
{
    // Normalisation de la clé entre 0 et 25
    cle = (cle % 26 + 26) % 26;

    for (int i = 0; texte[i] != '\0'; i++)
    {
        if (isupper((unsigned char)texte[i]))
        {
            texte[i] = (texte[i] - 'A' + cle) % 26 + 'A';
        }
        else if (islower((unsigned char)texte[i]))
        {
            texte[i] = (texte[i] - 'a' + cle) % 26 + 'a';
        }
        // Les ponctuations, espaces et chiffres restent inchangés
    }
}

void DechiffrerCesar(char *texte, int cle)
{
    // Déchiffrer revient à chiffrer avec un décalage de 26 - cle
    ChiffrerCesar(texte, 26 - (cle % 26));
}

int main(void)
{
    char message[100] = "Rendez-vous a minuit au laboratoire secret !";
    int cle = 4;

    printf("Message original   : %s\n", message);

    ChiffrerCesar(message, cle);
    printf("Message chiffre (K=%d): %s\n", cle, message);

    DechiffrerCesar(message, cle);
    printf("Message dechiffre  : %s\n", message);

    return 0;
}
Sortie console
Message original   : Rendez-vous a minuit au laboratoire secret !
Message chiffre (K=4): Virhiv-zsyc e qmrymx ey pefsvexsmvi wigvix !
Message dechiffre  : Rendez-vous a minuit au laboratoire secret !

Vous maîtrisez la manipulation des chaînes de caractères. Dans la Partie 7, nous allons aborder la persistance des données sur disque avec la gestion des fichiers.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue