IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Étude détaillée du module String de la libc


précédentsommairesuivant

XII. c_strchr

XII-A. Prototype

 
Sélectionnez
char * c_strchr (const char * s, int c);

XII-B. Description et comportement

La fonction c_strchr permet de rechercher la première occurrence du caractère c (par conversion du type entier en caractère) dans la chaine s passée en argument. Le zéro de fin participe à la recherche ainsi, lorsque vous passez le caractère nul comme caractère à rechercher, la fonction renvoie un pointeur sur la fin de la chaine !

Si le caractère passé en argument ne figure pas dans la chaine, la fonction renvoie la valeur NULL.

La chaine de caractères doit posséder un caractère de code nul sinon il y a risque de dépassement de la zone mémoire passée en argument ce qui peut induire un comportement indéterminé de votre programme !

XII-C. Algorithme

Voici un algorithme possible pour la fonction c_strchr :

 
Sélectionnez
algorithme
   fonction c_strchr (s:chaîne, c:entier):chaîne
      debut
         i <- 0
 
         tant que s[i] différent de c faire
            si s[i] == '\0'
               alors retourne NULL
            fsi
 
            i <- i + 1
         ftant
 
         retourne s[i]
      fin
 
lexique
   s : chaine : Chaine dans laquelle il faut trouver la première occurrence du caractère c.
   c : entier : Caractère dont il faut trouver la première occurrence dans la chaine s.
   i : entier : Variable d'incrémentation pour se déplacer dans la chaine s.

L'algorithme est ici très basique, nous parcourons simplement la chaine s jusqu'à trouver le caractère passé en second argument. Si on rencontre le caractère de fin de chaine avant de trouver la première occurrence du caractère qui est recherché, la fonction se termine en renvoyant la valeur NULL.

À chaque tour de boucle on incrémente i et on fait le test pour déterminer si l'on se trouve à la fin de chaine.

On termine par renvoyer l'emplacement mémoire du caractère si une occurrence existe.

Complexité temporelle dans le pire des cas :

Dans le pire des cas où on ne trouve pas le caractère : complexité en O(taille(s))

XII-D. Implémentation

 
Sélectionnez
char * c_strchr (const char * s, int c)
{
   const char * p = s;
 
   while (*p != (char) c)
   {
      if (*p == 0)
      {
         return NULL;
      }
 
      p++;
   }
 
   return (char *) p;
}

L'implémentation est ici légèrement différente, car adaptée aux pointeurs et donc au C.

Au lieu d'utiliser une variable d'incrémentation, nous utilisons un pointeur qui permet de se déplacer dans la chaine de caractères. Nous pouvons remarquer que le caractère à rechercher est un entier tel qu'il l'a été dit dans la description, il nous faut donc convertir par cast cette valeur afin de pouvoir effectuer le test correctement.

XII-E. Tests

 
Sélectionnez
#include "c_string.h"
#include <stdio.h>
 
 
int main (void)
{
   const char * str = "Ma chaine de caracteres !";
   char * p = NULL;
 
   p = c_strchr (str, 'c');
 
   if (p != NULL)
   {
      printf ("%s\n", p);
   }
 
   return 0;
}

Le test est simple, nous recherchons le caractère c dans la chaine str puis nous affichons le résultat ce qui correspond à la sortie suivante :

 
Sélectionnez
chaine de caracteres !
 
Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.

précédentsommairesuivant

Copyright © 2007 Franck Hecht. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.