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

XI. c_strncat

XI-A. Prototype

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

XI-B. Description et comportement

La fonction c_strncat concatène n caractères de la chaîne src vers la chaîne dest. Si la fonction rencontre un caractère de fin de chaîne durant les n caractères elle s'arrête et sinon, la fonction ne copie pas plus que la longueur n.

Quel que soit le cas de figure, la fonction ajoute un caractère nul pour marquer la fin de la chaîne dest !

Si la chaîne src est vide alors la chaîne dest sera inchangée.

La concaténation commençant à la fin de la chaîne dest, si celle-ci ne dispose pas d'un caractère de fin de chaîne, la fonction continue la recherche de ce dernier jusqu'à en trouver un. Par conséquent l'écriture se fera alors dans une zone de mémoire quelconque pouvant entraîner un comportement indéterminé de votre programme en plus d'un potentiel écrasement des données en mémoire.

Il faut par conséquent s'assurer que les chaînes de caractères possèdent un zéro terminal et également que la chaîne dest soit assez grande pour stocker la chaîne src en plus de ses propres caractères et bien sûr son zéro de fin !

XI-C. Algorithme

Voici un algorithme possible pour la fonction c_strncat:

 
Sélectionnez
algorithme
   fonction c_strncat (dest:chaîne, src:chaîne, n:entier):chaîne
      debut
         i <- 0
         j <- longueur (dest)
 
         faire
            dest[j] <- src[i]
 
            j <- j + 1
            i <- i + 1
         tant que n <- n - 1 et src[i] différent de '\0'
 
         retourne dest;
      fin
 
lexique
   dest : chaîne : Chaine de destination, adresse renvoyée par la fonction.
   src  : chaîne : Chaine source.
   n    : entier : Nombre de caractères à copier.
   i    : entier : Variable d'incrémentation pour se déplacer dans la chaîne src.
   j    : entier : Variable d'incrémentation pour se déplacer dans la chaîne dest.

Nous commençons par déclarer deux variables pour le déplacement dans les chaînes dest et src. Ici i pour la chaîne src que nous initialisons à 0 et j pour la chaîne dest que nous initialisons à la longueur de la chaîne dest, on se positionne donc sur le caractère de fin de celle-ci.

La boucle parcourt de 0 jusqu'à n les caractères de la chaîne src ou jusqu'à trouver un caractère de fin de chaîne (en réalité cet algorithme est identique à celui de la fonction c_strcat à part l'instruction de décrémentation qui vient s'ajouter dans la condition de la boucle).

Dans le corps de la boucle nous copions le caractère courant et nous incrémentons les variables i et j.

A la sortie de la boucle nous retournons l'adresse de la chaîne dest.

Complexité temporelle dans le pire des cas:
Dans le pire des cas n>=taille(src): complexité en O(taille(src)+C(c_strlen(dest))

XI-D. Implémentation

 
Sélectionnez
char * c_strncat (char * dest, const char * src, c_size_t n)
{
   const char * p1 = src;
   char * p2 = dest + c_strlen (dest);
 
   do
   {
      *p2++ = *p1++;
   }
   while (n-- && *p1);
 
   return dest;
}

Tout comme la fonction c_strcat précédente, l'implémentation change un petit peu car elle est adaptée à l'utilisation des pointeurs, je n'entrerai donc pas dans les détails d'implémentation ici car ceci a déjà été dans le chapitre précédent !

XI-E. Tests

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

Dans ce programme de test on ne concatène qu'une partie de la chaîne str2 donc ici jusqu'au caractère s. On peut tester également le comportement de la fonction si elle trouve un zéro de fin durant les n caractères comme par exemple avec une chaîne str2 ci-dessous:

 
Sélectionnez
const char str2 [] = "de carac\0teres !";

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.