Blog ENI : Toute la veille numérique !
Jusqu'à ce soir ! : -25€ dès 75€ sur les livres en ligne, vidéos... code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Développement informatique
  3. Les chaînes de caractères
Extrait - Développement informatique Apprenez à concevoir avant de programmer
Extraits du livre
Développement informatique Apprenez à concevoir avant de programmer
3 avis
Revenir à la page d'achat du livre

Les chaînes de caractères

Objectifs du chapitre

Développer des applications utilisant des chaînes de caractères.

Présentation

1. Définition

En C, il n’y a pas de type « chaîne de caractères ».

Une chaîne de caractères est une suite d’octets terminée par un octet de valeur 0.

On a tout de même utilisé (dans les fonctions scanf, printf) des chaînes de format d’édition ou de saisie entourées de : " ". Cette notation désigne conventionnellement l’adresse en mémoire d’une suite d’octets terminée par un octet de valeur zéro. Autrement dit, l’opérateur " " retourne l’adresse mémoire du premier octet de la chaîne. Chaque octet contient le code ASCII d’un caractère.

2. Affichage des lettres d’une chaîne et de leurs adresses

La déclaration char* chaine réserve une zone mémoire pouvant contenir une adresse d’un entier de type char :


int main() 
{  
    char* chaine; 
images/01042a.png

L’instruction suivante met dans chaine l’adresse du premier caractère de la chaîne constante "Oie".


    chaine = "Oie";
 
images/01042b.png

Rappel : la notation ’e’ (simple quote) signifie le code ASCII de la lettre e (101).

Le code suivant correspond à une boucle d’affichage des caractères, de leurs codes ASCII et de leurs adresses. La boucle se termine quand elle...

Affichage d’une chaîne de caractères

Les fonctions printf() et puts() permettent d’afficher une chaîne de caractères.


int main() 
{ 
    char* adresse; 
    adresse = "Oie";
 

Les deux instructions suivantes produisent le même résultat :


    puts(adresse); 
    printf("%s\n", adresse);
 

Elles prennent comme paramètre une adresse (char*). Elles affichent le caractère correspondant à l’octet qui se trouve à cette adresse, puis tous les octets qui suivent jusqu’à l’octet de valeur 0 :

Le code suivant correspond à une expérience "amusante" de modification de l’adresse de la chaîne à afficher.

L’adresse de début de l’affichage est incrémentée à chaque itération. La boucle s’arrête quand la valeur se trouvant à cette adresse est le 0 final :


    printf("\n\n"); 
    puts(adresse); 
 
    do 
    { 
        adresse++; 
        puts(adresse); 
    } 
    while(*adresse != 0); 
 
    return 0; 
}
 

Voici le résultat de l’exécution de ce programme :

images/01043a.png

L’expérience « amusante »...

Stockage d’une chaîne de caractères

1. Tableau de caractères

Pour mettre une chaîne dans une variable, on utilise un tableau de char (ou unsigned char), suffisamment grand pour contenir toutes les lettres (tous les codes ASCII des lettres) et le 0 final.

Le tableau chaine est destiné à recevoir une chaîne de caractères de 80 caractères plus le zéro final :


int main() 
{ 
    char chaine[81];
 

La fonction gets(chaine) est une fonction de saisie clavier qui stocke tous les caractères tapés au clavier à partir de l’adresse chaine, jusqu’à la fin de la saisie (provoquée par l’appui de la touche [Entrée]). Elle ajoute le 0 final :


    printf("Saisir une chaine de caracteres : "); 
    gets(chaine);
 
images/01044a.png

 
    printf("\n\nChaine saisie --> "); 
    puts(chaine); 
 
    return 0; 
}
 

Voici le résultat de l’exécution de ce programme :

images/01044b.png

Les zones de stockage doivent être des variables préalablement réservées, ce qui est le cas du tableau chaine.

2. Erreurs courantes

Les deux programmes suivants illustrent des erreurs courantes dans le traitement des chaînes.

  • Le premier illustre une tentative de stockage dans une zone non réservée.

  • Le deuxième illustre une tentative...

Bibliothèque standard de manipulation des chaînes : string.h

1. Liste des fonctions

  • strcpy    char *strcpy(char *but, const char *source)

    Copie la chaîne source à l’adresse but (y compris le 0 de fin) et fournit en retour l’adresse de but.

  • strncpy    char *strncpy(char *but, const char *source, int lgmax)

    Copie au maximum lgmax caractères de la chaîne source à l’adresse but (y compris le 0 de fin) en complétant éventuellement par des 0 si cette longueur maximale n’est pas atteinte. La fonction fournit en retour l’adresse de but.

  • strcat    char *strcat(char *but, const char *source)

    Recopie la chaîne source à la fin de la chaîne but et fournit en retour l’adresse de but.

  • strncat    char *strncat(char *but, const char *source, int lgmax)

    Recopie au maximum lgmax caractères de la chaîne source à la fin de la chaîne but et fournit en retour l’adresse de but.

  • strcmp    int strcmp(const char *chaine1, const char *chaine2)

    Compare chaine1 et chaine2 et fournit :

  • la valeur 0 si chaîne1 = chaîne2 ;

  • une valeur inférieure à 0 si chaîne1 < chaîne2 ;

  • une valeur supérieure à 0 si chaîne1 > chaîne2.

  • strncmp    int strncmp(const char *chaine1, const char *chaine2, int lgmax)

    Réalise la même opération...

Utilisation des chaînes pour les saisies numériques

Saisir des valeurs numériques en utilisant la fonction scanf() est pratique. L’utilisation de cette fonction peut toutefois produire quelques anomalies.

1. Problème du scanf()

La fonction scanf() doit être utilisée avec précaution. En particulier, en cas de saisie numérique erronée. Le programme suivant effectue deux saisies numériques consécutives :


int main() 
{ 
    int i; 
    double x; 
 
    printf("Saisir l'entier i : "); 
    scanf("%d", &i); 
    printf("i = %d\n", i); 
 
    printf("\n\nSaisir le double x : "); 
    scanf("%lf", &x); 
    printf("x = %lf\n", x); 
 
    return 0; 
}
 

Voici le résultat de l’exécution de ce programme :

images/01046a.png

Les saisies effectuées au clavier sont stockées dans un espace mémoire désigné sous le nom de "buffer clavier". C’est dans cet espace que la fonction scanf() va chercher les informations qu’elle attend. Si le buffer est vide, la fonction attend une saisie. S’il n’est pas vide, la fonction cherche directement les données dans le buffer.

Dans notre exemple, la première fonction scanf()...

Travail pratique : chaînes de caractères

1. Sujet

Exercice 1

Compter le nombre de ’e’ contenus dans une chaîne saisie au clavier (maximum 80 caractères).

Exercice 2

Supprimer tous les caractères ’e’ contenus dans une chaîne saisie au clavier (maximum 80 caractères).

Exercice 3

Inverser une chaîne saisie au clavier (maximum 80 caractères).

Exemple : saisir « toto », afficher « otot ».

Exercice 4

Afficher la position du premier et du dernier caractère non blanc d’une chaîne saisie au clavier (maximum 80 caractères).

Exercice 5

  • Saisir une chaîne de caractères au clavier (maximum 80 caractères).

  • Saisir une sous-chaîne au clavier.

  • Saisir une position (entier).

  • Placer la sous-chaîne dans la chaîne à la position saisie (la sous-chaîne doit pouvoir s’insérer dans les 80 caractères de la chaîne).

2. Chaînes de caractères : proposition de correction

a. Exercice 1

Compter le nombre de ’e’ contenus dans une chaîne.

ligne : ligne saisie au clavier.

debut : adresse du début de la zone de ligne à examiner.

compteur : nombre de ’e’ trouvés.


int main() 
{ 
    char ligne[81];  
    char* debut; 
    int compteur; 
 
    printf("Entrer une ligne (maximum 80 caracteres) :\n"); 
    gets(ligne); 
 
    compteur = 0;
 

La fonction strchr() cherche un caractère à partir d’une adresse. La fonction strchr() suivante cherche ’e’ à partir du début du tableau ligne. La variable debut contient l’adresse du premier (ou 0 s’il n’y a pas de ’e’ dans ligne) :


    debut = strchr(ligne, 'e');
 

Tant que debut n’est pas nul, on a trouvé un ’e’ :


    while (debut!= 0) 
    { 
        compteur++;
 

L’incrémentation du pointeur le positionne sur la lettre qui suit le ’e’ trouvé :


        debut++;
 

strchr() cherche le ’e’ suivant :


        debut = strchr(debut, 'e'); 
    } 
 
    printf("\n\nNombre...