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 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:
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▲
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 :
- 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 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 !