XIV. c_strcmp▲
XIV-A. Prototype▲
int
c_strcmp (
const
char
*
s1, const
char
*
s2);
XIV-B. Description et comportement▲
La fonction c_strcmp compare deux chaines de caractères, le caractère nul participe à la comparaison et par conséquent, une chaine possédant ce caractère sera inférieure à l'autre !
La fonction renvoie trois valeurs suivant des cas précis :
- Valeur négative si la chaine d'adresse s1 est inférieure à la chaine d'adresse s2 ;
- Zéro si les deux chaines de caractères sont identiques ;
- Valeur positive si la chaine d'adresse s1 est supérieure à la chaine d'adresse s2.
La norme du C ne précise cependant pas quelle est la valeur renvoyée. Dans certaines implémentations comme sur Linux et Windows par exemple, cette fonction renvoie les valeurs -1, 0, 1, mais dans d'autres implémentations cette fonction peut directement retourner le résultat de la soustraction des deux octets différents !
La comparaison des octets se fait par conversion du type void * en un type unsigned char * !
XIV-C. Algorithme▲
Voici un algorithme possible pour la fonction c_strcmp :
algorithme
fonction c_strcmp (s1:chaîne, s2:chaîne):entier
debut
i <- 0
tant que s1[i] égal à s2[i] faire
si s1[i] == 0
alors retourne 0
fsi
i <- i + 1
ftant
retourne -1 si s1[i] inférieur à s2[i] sinon retourne 1
fin
lexique
s1 : chaine : Chaine de caractères pour la comparaison avec la chaine s2.
s2 : chaine : Chaine de caractères pour la comparaison.
i : entier : Variable de parcours des octets des chaines.
L'algorithme ci-dessus parcourt les deux chaines simultanément. L'instruction de la boucle permet de détecter la première paire d'octets qui sont différents. Le corps de la boucle permet de déterminer si l'on se trouve à la fin de la chaine s1 où dans ce cas précis, nous mettons fin à la fonction en retournant la valeur 0 pour indiquer que les deux chaines sont identiques.
Complexité temporelle dans le pire des cas : |
---|
Dans le pire des cas où on parcourt toute la chaine s1 : complexité en O(taille(s1)) |
XIV-D. Implémentation▲
int
c_strcmp (
const
char
*
s1, const
char
*
s2)
{
const
unsigned
char
*
p_s1 =
s1;
const
unsigned
char
*
p_s2 =
s2;
while
(*
p_s1 ==
*
p_s2)
{
if
(*
p_s1 ==
0
)
{
return
0
;
}
p_s1++
;
p_s2++
;
}
return
*
p_s1 <
*
p_s2 ? -
1
: 1
;
}
Notre implémentation est presque identique à l'algorithme à ceci près que nous utilisons des pointeurs de type unsigned char * (en effet, tout comme la fonction c_memcmp, la comparaison se fait par conversion des octets en unsigned char) et nous en incrémentons leur position à chaque tour de boucle ! On utilise également l'opérateur ternaire pour la dernière instruction return ce qui facilite l'implémentation de la fonction !
Si la boucle se termine avec des caractères différents, nous quittons la fonction en retournant -1 si la chaine s1 est inférieure à la chaine s2, 1 dans le cas contraire !
XIV-E. Tests▲
#include "c_string.h"
#include <stdio.h>
int
main (
void
)
{
char
*
str1 =
"
Une chaine de caracteres !
"
;
char
*
str2 =
"
Une chaine de caracteres !
"
;
char
*
str3 =
"
Une chaine... !
"
;
char
*
str4 =
"
Ma chaine de caracteres... !
"
;
printf (
"
Test 1 : %d
\n
"
, c_strcmp (
str1, str2));
printf (
"
Test 2 : %d
\n
"
, c_strcmp (
str2, str3));
printf (
"
Test 3 : %d
\n
"
, c_strcmp (
str3, str4));
return
0
;
}
Dans ce programme de test, nous faisons trois comparaisons pour vérifier tous les points de la fonction c_strcmp. Nous commençons par un test d'égalité, un test d'infériorité puis pour finir un test de supériorité ! Voici ce que cela donne en sortie sur la console :
Test 1 : 0
Test 2 : -1
Test 3 : 1
Process returned 0 (0x0) execution time : 0.031 s
Press any key to continue.