XVIII. c_strcspn▲
XVIII-A. Prototype▲
c_size_t c_strcspn (
const
char
*
s1, const
char
*
s2);
XVIII-B. Description et comportement▲
La fonction c_strcspn calcule la longueur du segment initial de la chaine s1 ne contenant aucun des caractères de l'ensemble s2.
Le caractère de fin de chaine ne participe pas à la recherche.
La fonction renvoie la taille du segment initial ne contenant aucun caractère de l'ensemble s2 ou 0 dans le cas contraire.
XVIII-C. Algorithme▲
Voici un algorithme possible pour la fonction c_strcspn :
algorithme
fonction c_strcspn (s1:chaîne, s2:chaîne):entier
début
i <- 0
j <- 0
len_s1 <- longueur (s1)
len_s2 <- longueur (s2)
size <- 0
quit <- 0
pour i de 0 à len_s1 et tant que quit égal à 0 faire
pour j de 0 à len_s2 et tant que quit égal à 0 faire
si s2[j] égal à s1[i]
alors quit <- 1
fsi
fpour
si quit égal à 0
alors size <- size + 1
fsi
fpour
retourne size
fin
lexique
s1 : chaine : Chaine de caractères de recherche.
s2 : chaine : Ensemble de caractères ne devant pas se trouver dans le segment initial de la chaine s1.
i : entier : Variable d'incrémentation pour le parcours de la chaine s1.
j : entier : Variable d'incrémentation pour le parcours de l'ensemble s2.
len_s1 : entier : Longueur de la chaine s1.
len_s2 : entier : Longueur de l'ensemble s2.
size : entier : Taille du segment initial.
quit : entier : Drapeau de sortie de la fonction.
Nous commençons comme d'habitude par initialiser des variables, on initialise de même à la valeur 0 la variable size qui est celle utilisée pour stocker la taille du segment initial ainsi que la variable quit qui est le drapeau de sortie de la fonction.
Notre première boucle dispose de deux conditions de sortie et se termine lorsqu'une des deux devient vraie à savoir dans l'ordre :
- Si la variable quit vaut 1 ;
- Si la fin de la chaine s1 a été atteinte.
Nous attaquons ensuite le parcours de l'ensemble s2 (un parcours complet de l'ensemble est effectué à chaque tour de la première boucle). Nous possédons ici également deux conditions d'arrêt de la boucle à savoir :
- Si la variable quit vaut 1 ;
- Si la fin de la chaine s2 a été atteinte.
Si au cours de cette boucle un caractère de l'ensemble s2 est présent dans le segment initial de la chaine s1, nous mettons la variable quit à la valeur 1 ce qui nous permettra de quitter la fonction, car elle aura atteint sa condition de sortie.
À la fin de la seconde boucle, si la variable quit vaut 0 alors on incrémente la variable size de 1 et on continue le parcours de la chaine s1 !
Complexité temporelle dans le pire des cas : |
---|
Dans le pire des cas (s2[j] != s1[i]): complexité en O(taille(s1)*taille(s2)+C(c_strlen(s1))+C(c_strlen(s2))) |
XVIII-D. Implémentation▲
c_size_t c_strcspn (
const
char
*
s1, const
char
*
s2)
{
c_size_t j =
0
;
c_size_t i =
0
;
c_size_t len_s1 =
c_strlen (
s1);
c_size_t len_s2 =
c_strlen (
s2);
c_size_t size =
0
;
int
quit =
0
;
for
(
i =
0
; !
quit &&
i <
len_s1; i++
)
{
for
(
j =
0
; !
quit &&
j <
len_s2; j++
)
{
if
(
s2[j] ==
s1[i])
{
quit =
1
;
}
}
if
(!
quit)
{
size++
;
}
}
return
size;
}
L'implémentation présentée ci-dessus reflète avec exactitude l'algorithme décrit plus haut. Il faut juste noter que les variables i et j sont déclarées en type c_size_t pour satisfaire des futurs avertissements du compilateur, car nous faisons dans le cas contraire des comparaisons entre type int et unsigned int !
Il n'est jamais conseillé de mettre plusieurs conditions dans des boucles for contrairement à ce qui a été fait ici. Cela n'arrange pas toujours la bonne lisibilité et compréhension du code, mais cela nous a permis dans l'implémentation ci-dessus d'écrire un code plus court et plus simple.
XVIII-E. Tests▲
#include "c_string.h"
#include <stdio.h>
int
main (
void
)
{
printf (
"
%d
\n
"
, c_strcspn (
"
Bonjour , le monde !
"
, "
"
));
return
0
;
}
Dans notre court exemple ci-dessus, nous calculons la taille du segment initial dont les caractères n'appartiennent pas à l'ensemble passé en second argument ce qui nous donne le mot « Bonjour » donc une taille de 7 :
7
Process returned 0 (0x0) execution time : 0.031 s
Press any key to continue.