IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Étude détaillée du module String de la libc

Etude détaillée du module String de la libc


précédentsommairesuivant

XIV. c_strcmp

XIV-A. Prototype

 
Sélectionnez
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:

 
Sélectionnez
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

 
Sélectionnez
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

 
Sélectionnez
#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 :

 
Sélectionnez
Test 1 : 0
Test 2 : -1
Test 3 : 1
 
Process returned 0 (0x0)   execution time : 0.031 s
Press any key to continue.

précédentsommairesuivant

Copyright © 2007 Franck Hecht. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.