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. À 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, 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 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 :
ret = de caracteres !
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.