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 chaine 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 chaine !
Si le caractère passé en argument ne figure pas dans la chaine, la fonction renvoie la valeur NULL.
La chaine 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 : chaine : Chaine 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 chaine s.
i : entier : Variable d'incrémentation pour se déplacer dans la chaine s.
L'algorithme est ici très basique, nous parcourons simplement la chaine s jusqu'à trouver le caractère passé en second argument. Si on rencontre le caractère de fin de chaine avant de trouver la première occurrence du caractère qui est recherché, la fonction se termine en renvoyant la valeur NULL.
À chaque tour de boucle on incrémente i et on fait le test pour déterminer si l'on se trouve à la fin de chaine.
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 chaine 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 chaine 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.