En langage C, comme les chaînes de caractères ne sont que des tableaux de char, on ne peut pas leur appliquer les opérateurs mathématiques ordinaires : écrire chaine1 = chaine2 ou chaine1 == chaine2 ne manipule que les adresses mémoire des tableaux et ne copie ni ne compare leurs contenus !
Pour effectuer ces opérations indispensables, le standard C fournit la bibliothèque spécialisée <string.h>.
1. Calculer la longueur : strlen()#
La fonction strlen() (string length) parcourt la chaîne jusqu'au caractère sentinelle '\0' et renvoie le nombre exact de caractères utiles (le '\0' n'est pas comptabilisé) :
#include <stdio.h>
#include <string.h>
int main(void)
{
char mot[] = "Programmation";
size_t longueur = strlen(mot);
size_t taille_memoire = sizeof(mot);
printf("Mot : %s\n", mot);
printf("Nombre de lettres : %zu\n", longueur); // Affiche 13
printf("Octets en memoire RAM: %zu octets\n", taille_memoire); // Affiche 14 (avec le '\0')
return 0;
}
2. Copier une chaîne : strcpy() et strncpy()#
On ne peut pas affecter une chaîne à une autre avec le symbole = après leur déclaration. On utilise strcpy() (string copy) ou sa version sécurisée strncpy() :
#include <stdio.h>
#include <string.h>
int main(void)
{
char source[] = "AlgoJungle";
char destination[30];
// Copie intégrale
strcpy(destination, source);
printf("Destination apres strcpy : %s\n", destination);
// Copie sécurisée bornée à N caractères
char abreviation[5];
strncpy(abreviation, source, 4);
abreviation[4] = '\0'; // Toujours s'assurer que le '\0' final est bien posé !
printf("Abreviation 4 lettres : %s\n", abreviation); // Affiche : Algo
return 0;
}
3. Concaténer (fusionner) des chaînes : strcat() et strncat()#
Pour juxtaposer une chaîne à la suite d'une autre (concaténation), on utilise strcat() (string concatenate) :
#include <stdio.h>
#include <string.h>
int main(void)
{
char message[50] = "Bonjour ";
char nom[] = "Joseph Konka";
// Ajoute 'nom' à la fin de 'message'
strcat(message, nom);
printf("Resultat : %s\n", message); // Affiche : Bonjour Joseph Konka
return 0;
}
[!WARNING] Assurez-vous impérativement que le tableau de destination est suffisamment grand pour accueillir la chaîne initiale, la chaîne à ajouter ET le caractère nul
'\0', sans quoi vous provoquerez un écrasement de mémoire.
4. Comparer deux chaînes : strcmp() et strncmp()#
[!IMPORTANT] Écrire
if (chaine1 == chaine2)compare les adresses mémoires des deux tableaux (qui sont toujours différentes !). Pour comparer le contenu textuel, on doit obligatoirement utiliserstrcmp()(string compare).
La fonction strcmp(s1, s2) compare les chaînes caractère par caractère selon leur code ASCII :
- Elle renvoie 0 si les deux chaînes sont strictement identiques.
- Elle renvoie une valeur inférieure à 0 (< 0) si s1 précède s2 dans l'ordre alphabétique.
- Elle renvoie une valeur supérieure à 0 (> 0) si s1 suit s2.
#include <stdio.h>
#include <string.h>
int main(void)
{
char mdp_correct[] = "Secret123";
char saisie[30];
printf("Entrez le mot de passe : ");
scanf("%29s", saisie);
if (strcmp(saisie, mdp_correct) == 0)
{
printf("Acces autorise ! Bienvenue.\n");
}
else
{
printf("Mot de passe incorrect !\n");
}
return 0;
}
5. Rechercher dans une chaîne : strchr() et strstr()#
strchr(chaine, caractere): Recherche la première apparition d'un caractère. Renvoie un pointeur vers cet emplacement ouNULLsi absent.strstr(chaine, sous_chaine): Recherche la première occurrence d'un mot complet au sein d'une phrase.
#include <stdio.h>
#include <string.h>
int main(void)
{
char email[] = "contact@algojungle.com";
// 1. Recherche du symbole '@'
char *arobase = strchr(email, '@');
if (arobase != NULL)
{
printf("Symbole '@' trouve a la position %td\n", arobase - email);
printf("Domaine associe : %s\n", arobase + 1); // Affiche : algojungle.com
}
// 2. Recherche du mot "algo"
char *trouve = strstr(email, "algo");
if (trouve != NULL)
{
printf("Le mot cle 'algo' a bien ete detecte !\n");
}
return 0;
}
6. Réimplémentation manuelle de strlen et strcmp#
Comprendre ces fonctions consiste à savoir les réécrire vous-même :
#include <stdio.h>
size_t MonStrlen(const char *s)
{
size_t longueur = 0;
while (s[longueur] != '\0')
{
longueur++;
}
return longueur;
}
int MonStrcmp(const char *s1, const char *s2)
{
while (*s1 != '\0' && (*s1 == *s2))
{
s1++;
s2++;
}
return (unsigned char)*s1 - (unsigned char)*s2;
}
Vous maîtrisez désormais tout l'arsenal de manipulation textuelle en C. Résolvons maintenant des cas d'application concrets dans la section d'exercices.
Commentaires