XI. c_strncat▲
XI-A. Prototype▲
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:
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▲
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▲
#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:
const
char
str2 [] =
"
de carac
\0
teres !
"
;