HOWTO · C
Vérifiez si la chaîne contient une sous-chaîne en C
Cet article montre comment vérifier si une chaîne de caractères contient une sous-chaîne en C
Sur cette page
Pour vérifier si une chaîne C terminée par un caractère nul contient une sous-chaîne exacte, en tenant compte de la casse, appelez strstr depuis <string.h>. La fonction renvoie un pointeur vers la première occurrence, ou NULL si elle n’en trouve aucune. Les exemples ci-dessous ont été exécutés et affichent Substring found. ; ce message reste en anglais dans les blocs immuables.
Vérifier la présence d’une sous-chaîne avec strstr
Passez la chaîne complète en premier argument et le texte recherché en second. Testez directement le pointeur renvoyé ; ne l’affichez pas comme une adresse, car sa valeur dépend du processus. strstr, déclarée dans l’en-tête standard C <string.h>, compare les caractères exactement, casse comprise.
Ce programme recherche welcome dans une phrase et affiche un message stable indiquant si la sous-chaîne a été trouvée.
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Hello, welcome to C.";
const char *needle = "welcome";
if (strstr(text, needle) != NULL) {
puts("Substring found.");
} else {
puts("Substring not found.");
}
return 0;
}
Substring found.
Le pointeur renvoyé désigne le premier caractère correspondant dans text : vous pouvez donc l’utiliser pour examiner la chaîne à partir de cette position ou poursuivre le traitement. Un pointeur différent de NULL indique qu’une correspondance existe. Si le texte recherché est "", strstr renvoie le début de text. Tenez compte de ce comportement standard si une recherche vide ne doit pas être considérée comme une correspondance dans votre application.
Rechercher une sous-chaîne avec une boucle
Une recherche manuelle permet de rendre explicite le processus de comparaison ou d’y ajouter un comportement propre à l’application. La fonction ci-dessous accepte deux chaînes terminées par un caractère nul et non nulles ; elle renvoie 1 si le texte recherché est présent, et 0 dans le cas contraire. Elle vérifie les longueurs avant de les soustraire, ce qui évite un dépassement arithmétique non signé lorsque le texte recherché est plus long que la chaîne d’entrée. Comme strstr, elle considère qu’un texte recherché vide correspond à une occurrence.
#include <stdio.h>
#include <string.h>
int contains_substring(const char *text, const char *needle) {
size_t text_len = strlen(text);
size_t needle_len = strlen(needle);
if (needle_len == 0) {
return 1;
}
if (needle_len > text_len) {
return 0;
}
for (size_t i = 0; i <= text_len - needle_len; ++i) {
size_t j = 0;
while (j < needle_len && text[i + j] == needle[j]) {
++j;
}
if (j == needle_len) {
return 1;
}
}
return 0;
}
int main(void) {
const char *text = "Hello, welcome to C.";
const char *needle = "welcome";
puts(contains_substring(text, needle)
? "Substring found."
: "Substring not found.");
return 0;
}
Substring found.
La boucle externe essaie chaque position de départ où le texte recherché peut tenir en entier. La boucle interne avance tant que les caractères correspondants sont identiques. Si elle atteint la longueur du texte recherché, la fonction a trouvé une correspondance complète. Cette méthode simple est utile pour apprendre ou personnaliser la recherche ; pour une comparaison exacte ordinaire, préférez la fonction de la bibliothèque standard, sauf si vous avez une raison de maintenir votre propre code de recherche.
Vérifier la présence d’une sous-chaîne sans tenir compte de la casse
La bibliothèque standard C ne définit pas de fonction de recherche de sous-chaîne insensible à la casse. Sur les systèmes GNU, strcasestr recherche sans tenir compte de la casse et est disponible comme extension GNU. Définissez _GNU_SOURCE avant d’inclure les en-têtes pour demander sa déclaration sur les systèmes qui utilisent cette macro de sélection de fonctionnalités. Cette fonction ne fait pas partie du C standard portable : vérifiez donc qu’elle est disponible sur la plateforme cible avant de l’utiliser.
Cet exemple complet utilise du texte ASCII et montre l’appel propre à GNU. Il affiche Substring found. ; ce libellé reste en anglais dans le bloc immuable.
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
int main(void) {
const char *text = "Hello, Welcome to C.";
const char *needle = "welcome";
if (strcasestr(text, needle) != NULL) {
puts("Substring found.");
} else {
puts("Substring not found.");
}
return 0;
}
Substring found.
Pour écrire du code portable, implémentez la comparaison sans tenir compte de la casse en définissant explicitement une politique de traitement des caractères, au lieu de modifier silencieusement les chaînes d’entrée. La fonction tolower peut aider pour du texte traité octet par octet, mais son argument doit être EOF ou une valeur représentable par unsigned char, et son comportement dépend de la locale C active. Cette approche ne fournit pas à elle seule le repliement de casse Unicode. Choisissez une bibliothèque et une politique de traitement du texte adaptées aux données que votre programme doit traiter.
Gérer les cas limites et choisir une méthode
strstr et la boucle ci-dessus recherchent toutes deux dans des chaînes terminées par un caractère nul et comparent des séquences de caractères exactes. Si le texte recherché est plus long que le texte à examiner, aucune correspondance n’est possible. S’il est vide, strstr signale une correspondance au début de la chaîne, et l’implémentation par boucle suit la même convention ; ajoutez un test explicite si votre application doit appliquer une autre règle. La boucle exige des pointeurs non nuls, comme les fonctions standard de traitement des chaînes, qui nécessitent des arguments valides.
strstr renvoie la première occurrence. Pour trouver les suivantes, poursuivez la recherche à partir de la position qui suit la correspondance précédente de la longueur du texte recherché, en veillant à ce que celui-ci ne soit pas vide afin que la recherche avance. Si les correspondances qui se chevauchent vous intéressent, reprenez plutôt un caractère après la position précédente. Le choix dépend de la possibilité que plusieurs occurrences partagent des caractères.
Pour une recherche exacte ordinaire, sensible à la casse, utilisez strstr : cette fonction du C standard est concise. Choisissez une boucle manuelle pour expliquer ou personnaliser la comparaison, et documentez les hypothèses sur les entrées. Utilisez strcasestr uniquement si l’extension GNU est disponible et que son traitement des octets et sa dépendance à la locale conviennent à votre texte. strpbrk ne remplace pas une recherche exacte de sous-chaîne : cette fonction vérifie si l’un des caractères d’un ensemble apparaît dans la chaîne, ce qui répond à une autre question.