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

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


précédentsommairesuivant

VIII. c_strcpy

VIII-A. Prototype

 
Sélectionnez
char * c_strcpy (char * dest, const char * src);

VIII-B. Description et comportement

La fonction c_strcpy copie les caractères de la chaine src vers l'adresse de la chaine dest, le zéro de fin de chaine est également copié.

Si les deux chaines se chevauchent ou si la chaîne src ne contient pas de zéro final, le comportement du programme est indéterminé.

La fonction renvoie l'adresse de la chaine dest.

VIII-C. Algorithme

Voici un algorithme possible pour la fonction c_strcpy:

 
Sélectionnez
algorithme
   fonction c_strcpy (dest:chaîne, src:chaîne):chaîne
      debut
         i <- 0
 
         tant que dest[i] <- src[i] faire
            i <- i + 1
         ftant
 
         retourne dest
      fin
 
lexique
   dest : chaine : Chaine de destination, adresse renvoyée par la fonction.
   src  : chaine : Chaine source.
   i    : entier : Variable d'incrémentation pour se déplacer dans la chaine src.

Nous commençons par déclarer une variable qui permet de se déplacer à l'intérieur de la chaine src et dest caractère par caractère.

La condition d'arrêt de la boucle est si le dernier caractère de la chaine src est copié. La condition de la boucle est également l'instruction de copie du caractère courant. Nous pouvons en effet remarquer que l'algorithme copie dans la condition de la boucle, le caractère courant, y compris le zéro de fin !

Le bloc d'instruction de la boucle incrémente ici la variable i pour se placer sur le caractère suivant.

Une fois le dernier caractère copié, ici le caractère de fin, la fonction se termine en retournant l'adresse de la chaine dest.

Complexité temporelle dans le pire des cas :

Parcours simple de la boucle taille(src) fois : complexité en O(taille(src))

VIII-D. Implémentation

 
Sélectionnez
char * c_strcpy (char * dest, const char * src)
{
   while ((*dest++ = *src++));
   return dest;
}

L'implémentation est dans notre cas, en langage C, un peu plus courte. Ce rétrécissement est dû aux pointeurs. En effet, nous n'utilisons ici aucune variable de déplacement dans les chaines, mais nous incrémentons directement l'adresse des pointeurs et par conséquent, directement ceux des arguments de notre fonction.

Le déroulement en est simple, voici l'ordre :

  1. Copie du caractère courant (*dest = *src) ;
  2. Incrémentation de l'adresse de dest et src (dest++, src++).

La condition d'arrêt de la boucle se pose d'elle même lorsque l'instruction copie le dernier caractère. En effet, la boucle n'ayant plus de caractères à copier, elle se termine d'elle-même !

VIII-E. Tests

 
Sélectionnez
#include "c_string.h"
#include <stdio.h>
 
 
int main (void)
{
   const char str1 [26] = "Ma chaine de caracteres !";
   char str2 [26];
 
   c_strcpy (str2, str1);
   printf ("str1 : %s\n", str1);
   printf ("str2 : %s\n", str2);
 
   return 0;

Ce simple programme permet de tester la copie d'une chaine de caractères avec notre fonction c_strcpy. Pour tester les cas par exemple où la chaîne source str1(str2 étant ici la chaine de destination de la copie) n'a pas de zéro de fin, mettez simplement la valeur du nombre de caractères du tableau à 25 ce qui permet de voir dans le meilleur des cas que le caractère final est bien pris en compte dans la copie !


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.