IX. c_strncpy▲
IX-A. Prototype▲
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 :
- 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 ;
- 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 ;
- 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 :
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 !
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▲
#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 :
- Nous copions 20 caractères pour vérifier si la chaîne dest possède un caractère nul lorsque la fonction se termine ;
- 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 ;
- 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 :
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.