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

IX. c_strncpy

IX-A. Prototype

 
Sélectionnez
char * c_strncpy (char * dest, const char * src, c_size_t n);

IX-B. Description et comportement

La fonction c_strncpy copie les n premiers caractères de la chaine src vers la chaine dest. Le zéro de fin de chaine n'est pas copié contrairement à la fonction c_strcpy !

Plusieurs comportements suivant des cas précis sont à noter, les voici :

  1. Si la longueur n est inférieure à la longueur de la chaine src alors, la chaine dest ne possèdera pas de caractère de fin de chaine ;
  2. Si la longueur n est égale à la longueur de la chaine src alors, la chaine dest ne possèdera également pas de zéro final ;
  3. Si la longueur n est supérieure à la longueur de la chaine src alors, la chaine dest se verra attribuer des caractères nuls (zéro de fin) jusqu'à ce que la longueur n soit atteinte.

IX-C. Algorithme

Voici un algorithme possible pour la fonction c_strncpy :

 
Sélectionnez
algorithme
   fonction c_strncpy (dest:chaîne, src:chaîne, n:entier):chaîne
      debut
         i <- 0
 
         si n supérieur à 0 alors
            pour i de 0 à n faire
               si src[i] différent de '\0'
                  alors dest[i] <- src[i]
                  sinon fpour
               fsi
            fpour
 
            si i inférieur à n alors
               faire
                  dest[i] <- '\0'
                  i <- i + 1
               tant que i < n
            fsi
         fsi
 
         retourne dest
      fin
 
lexique
   dest : chaine : Chaine de destination, adresse renvoyée par la fonction.
   src  : chaine : Chaine source.
   n    : entier : Nombre de caractères à recopier.
   i    : entier : Variable d'incrémentation pour se déplacer dans la chaine src.

Comme à l'accoutumée, nous commençons par déclarer une variable d'incrémentation (ici « i ») et que nous initialisons à 0 !

Dans cet algorithme, nous mettons la suite complète des instructions restantes dans une seule condition principale ce qui évite de faire plusieurs return au sein d'une même fonction et c'est d'autant plus propre.

Dans la première boucle, nous copions simplement les caractères un par un de la chaine src vers dest de 0 à n, n étant le nombre de caractères à copier. La copie se poursuit tant que le caractère courant ne correspond pas au caractère nul donc au zéro de fin chaine, car comme il a été dit plus haut dans la description, ce caractère de la chaine src n'est pas copié !

Dans la seconde boucle, nous remplissons simplement le reste de la chaine dest avec des caractères nuls si bien sûr, nous n'avons pas atteint la longueur n dans la première boucle, le remplissage se fait alors jusqu'à atteindre cette longueur !

Pour finir, nous sortons de la fonction en retournant l'adresse de la chaine dest.

Complexité temporelle dans le pire des cas :

Si la première boucle ne va pas jusqu'à n alors la seconde s'en charge: complexité en O(n)

IX-D. Implémentation

Il n'y a rien de plus à préciser sur cette implémentation, car elle reflète exactement l'algorithme présenté ci-dessus !

 
Sélectionnez
char * c_strncpy (char * dest, const char * src, c_size_t n)
{
   c_size_t i = 0;
 
   if (n > 0)
   {
      for (i = 0; i < n; i++)
      {
         if (src[i] != '\0')
         {
            dest[i] = src[i];
         }
         else
         {
            break;
         }
      }
 
      if (i < n)
      {
         do
         {
            dest[i] = '\0';
            i++;
         }
         while (i < n);
      }
   }
 
   return dest;
}

IX-E. Tests

 
Sélectionnez
#include "c_string.h"
#include <stdio.h>
 
 
int main (void)
{
   const char str1 [26] = "Ma chaine de caracteres !";
   char str2 [30];
   char str3 [30];
   char str4 [30];
 
   c_strncpy (str2, str1, 20); /* Cas 1 */
   c_strncpy (str3, str1, 25); /* Cas 2 */
   c_strncpy (str4, str1, 30); /* Cas 3 */
 
   printf ("str1 : %s\n", str1);
   printf ("str2 : %s\n", str2);
   printf ("str3 : %s\n", str3);
   printf ("str4 : %s\n", str4);
 
   return 0;
}

Dans ce programme de test, nous réalisons les tests sur les trois cas cités dans la description de la fonction c_strncpy soit :

  1. Nous copions 20 caractères pour vérifier si la chaîne dest possède un caractère nul lorsque la fonction se termine ;
  2. Nous copions 25 soit la longueur exacte de la chaine dest sans compter le caractère de fin de chaine, pour tester le même comportement que le cas 1 ;
  3. Nous copions 30 caractères donc dans ce cas une longueur n supérieure à la taille de la chaine src pour vérifier que la chaine dest sera complétée avec des caractères nuls.

Vous devriez vous retrouver avec une sortie de ce genre, mais qui peut être sensiblement différente sur chaque ordinateur/système :

 
Sélectionnez
str1 : Ma chaine de caracteres !
str2 : Ma chaine de caractep ¥w    Ò-+wMa chaine de caracteres !
str3 : Ma chaine de caracteres ! ¥w    Ma chaine de caractep ¥w    Ò-+wMa chaine de caracteres !
str4 : Ma chaine de caracteres !
 
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.