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 chaîne src vers la chaîne dest. Le zéro de fin de chaîne
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 longueure de la chaîne src alors, la chaîne dest ne possèdera pas de caractère de fin de chaîne.
- Si la longueur n est égale à la longueure de la chaîne src alors, la chaîne dest ne possèdera également pas de zéro final.
- Si la longueur n est supérieure à la longueure de la chaîne src alors, la chaîne dest se verra attribuer des caractères nuls (zéro de fin) jusqu'à ce que la longueure 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 : chaîne : Chaine de destination, adresse renvoyée par la fonction.
src : chaîne : Chaine source.
n : entier : Nombre de caractères à recopier.
i : entier : Variable d'incrémentation pour se déplacer dans la chaîne 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 chaîne
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 chaîne car comme il a été dit plus haut dans la description, ce caractère de
la chaîne src n'est pas copié !
Dans la seconde boucle, nous remplissons simplement le reste de la chaîne 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 chaîne 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 chaîne dest sans compter le caractère de fin de chaîne, 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 chaîne src pour vérifier que la chaîne 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.