VIII. c_strcpy▲
VIII-A. Prototype▲
char
*
c_strcpy (
char
*
dest, const
char
*
src);
VIII-B. Description et comportement▲
La fonction c_strcpy copie les caractères de la chaîne src vers l'adresse
de la chaîne dest, le zéro de fin de chaîne est également copié.
Si les deux chaînes 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:
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 : chaîne : Chaine de destination, adresse renvoyée par la fonction.
src : chaîne : Chaine source.
i : entier : Variable d'incrémentation pour se déplacer dans la chaîne src.
Nous commençons par déclarer une variable qui permet de se déplacer à l'intérieur
de la chaîne src et dest caractère par caractère.
La condition d'arrêt de la boucle est si le dernier caractère de la chaîne 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 chaîne 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▲
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 chaînes 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:
- Copie du caractère courant (*dest = *src).
- 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▲
#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 chaîne de caractères avec notre fonction c_strcpy. Pour tester les cas par exemple où la chaîne source str1(str2 étant ici la chaîne 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 !