XII. c_strchr▲
XII-A. Prototype▲
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:
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▲
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▲
#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:
chaine de caracteres !
Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.