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 chaînes de caractères,
le caractère nul participe à la comparaison et par conséquent,
une chaîne 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 chaîne d'adresse s1 est inférieure à la chaîne d'adresse s2.
- Zéro si les deux chaînes de caractères sont identiques.
- Valeur positive si la chaîne d'adresse s1 est supérieure à la chaîne 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 : chaîne : Chaîne de caractères pour la comparaison avec la chaîne s2.
s2 : chaîne : Chaîne de caractères pour la comparaison.
i : entier : Variable de parcours des octets des chaînes.
L'algorithme ci-dessus parcourt les deux chaînes 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 chaîne s1
où dans ce cas précis, nous mettons fin à la fonction en
retournant la valeur 0 pour indiquer que les deux chaînes
sont identiques.
Complexité temporelle dans le pire des cas: |
---|
Dans le pire des cas où on parcourt toute la chaîne 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 chaîne s1
est inférieure à la chaîne 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.