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

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

Etude 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 chaîne 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 chaîne !

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

La chaîne 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 : chaîne : Chaîne 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 chaîne s.
   i : entier : Variable d'incrémentation pour se déplacer dans la chaîne s.

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

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

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 chaîne 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 chaîne 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.