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

VI. c_memchr

VI-A. Prototype

 
Sélectionnez
void * c_memchr (const void * s, int c, c_size_t n);

VI-B. Description et comportement

La fonction c_memchr permet de faire une recherche (par conversion en unsigned char *) d'un octet en partant de l'adresse s, et de longueur n.

Si l'octet est trouvé, la fonction retourne alors l'adresse de ce dernier sinon elle renvoie NULL.

VI-C. Algorithme

Voici un algorithme possible pour la fonction c_memchr :

 
Sélectionnez
algorithme
   fonction c_memchr (s:générique, c:entier, n:entier):générique
      début
         i <- 0
 
         tant que n <- n - 1 faire
            si s[i] égal à c
               alors retourne s[i]
            fsi
 
            i <- i + 1
         ftant
 
         retourne NULL
      fin
 
lexique
   s : générique : Adresse à partir de laquelle il faut commencer la recherche.
   c : entier    : Octet à retrouver.
   n : entier    : Longueur de la recherche.
   i : entier    : Variable de parcours de l'adresse s.

Dans cet algorithme nous parcourons directement l'adresse s avec la variable i que nous incrémentons à chaque tour de boucle. À chaque tour de boucle, on teste également si l'octet courant est identique à l'octet c.

Si la condition est vraie alors on retourne l'adresse de l'octet courant. Si l'octet n'est pas trouvé, la boucle se termine et on met fin à la fonction en renvoyant la valeur NULL !

Complexité temporelle dans le pire des cas :

Parcours simple de la boucle n fois: complexité en O(n)

VI-D. Implémentation

 
Sélectionnez
void * c_memchr (const void * s, int c, c_size_t n)
{
   const unsigned char * p_s = s;
 
   while (n--)
   {
      if (*p_s == c)
      {
         return (void *) p_s;
      }
 
      p_s++;
   }
 
   return NULL;
}

Dans la description il est précisé que la recherche de l'octet se fait par conversion de l'octet courant de l'adresse s en type unsigned char, c'est ce que nous faisons en faisant pointer notre adresse s par le pointeur p_s qui est du type demandé pour la recherche.

Dans le return de la condition à l'intérieur de la boucle, il nous faut faire un cast sur la valeur de retour, car, on doit renvoyer l'adresse sous la forme d'un type générique donc void *.

VI-E. Tests

 
Sélectionnez
#include "c_string.h"
#include <stdio.h>
 
 
int main (void)
{
   char * str = "Une S de caracteres !";
   char * ret = NULL;
 
   ret = c_memchr (str, 'd', 12);
   printf ("ret = %s\n", ret);
 
   return 0;
}

Dans ce programme d'exemple, nous recherchons l'octet désigné par 'd' dans la chaine de caractères str puis nous faisons retourner le résultat vers le pointeur ret et affichons le reste de la chaine à partir du début pointé par ret !

Ceci est à peu près le fonctionnement des fonctions c_strchr et c_strrchr, mais celles-ci ne sont destinées qu'aux chaines de caractères alors que la fonction c_memchr peut être appliquée à n'importe quel type de données !

Voici la sortie du programme ci-dessus :

 
Sélectionnez
ret = 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.