VI. c_memchr▲
VI-A. Prototype▲
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:
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. A 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▲
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 en effet,
on doit renvoyer l'adresse sous la forme d'un type générique donc
void *.
VI-E. Tests▲
#include "c_string.h"
#include <stdio.h>
int
main (
void
)
{
char
*
str =
"
Une chaine 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 chaîne de caractères str puis nous faisons retourner
le résultat vers le pointeur ret et affichons le reste de la
chaîne à 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 chaînes 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:
ret = de caracteres !
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.