STRNCPY |
Copie les N caractères d'une chaîne |
---|---|
Langage C++ | cstring (string.h) |
Syntaxe
char *strncpy(const char *str1,const char *str2,size_t n) |
Paramètres
Nom | Description |
---|---|
dest | Ce paramètre permet d'indiquer la chaîne de caractères ASCIZ recevant le contenu. |
source | Ce paramètre permet d'indiquer la chaîne de caractères ASCIZ à copier dans str1. |
n | Ce paramètre permet d'indiquer le nombre de caractères à copier. |
Description
Cette fonction permet de copier les «n» premiers caractères de la chaîne de caractères «str1» à la chaîne de caractères «str2».
Remarques
- La fonction strncpy() est utilisée pour copier jusqu'au compteur les caractères de la chaîne de caractères pointée par le paramètre str2 dans la chaîne de caractères pointée par le paramètre str1. Le paramètre de chaîne de caractères str2 doit être un pointeur vers une chaîne de caractères terminée par null.
- Si les paramètres de chaîne de caractères str1 et str2 se chevauchent, le comportement de strncpy() est imprévisible.
- Si la chaîne de caractères pointée par le paramètre str2 a moins de nombre de caractères, les valeurs nulles seront ajoutées à la fin de str1 jusqu'à ce que le nombre de caractères ait été copié.
- Alternativement, si la chaîne de caractères pointée par str2 est plus longue que le nombre de caractères, la chaîne de caractères résultante pointée par le paramètre str1 ne se terminera pas par null.
- La fonction strncpy() renvoie un pointeur sur le paramètre de chaîne de caractères str1.
- Ne garantit pas l'ajout du \0 final : Si la chaîne source contient n caractères ou plus, strncpy copie exactement n caractères sans ajouter de \0 terminal. Cela peut provoquer des erreurs lors de l'affichage ou d'autres manipulations de chaînes de caractères. Exemple problématique :
- Remplit le reste de la destination avec des \0 si nécessaire : Si la source a moins de n caractères, strncpy copie la chaîne de caractères puis remplit le reste avec des caractères \0. Exemple :
- Peut provoquer des dépassements de mémoire : strncpy ne vérifie pas si destination a une taille suffisante pour contenir n caractères. Si n est plus grand que la capacité du tableau destination, cela entraîne un dépassement de mémoire (buffer overflow). Exemple dangereux :
- Utilisation fréquente pour copier des sous-chaînes : strncpy est souvent utilisée pour copier une partie d'une chaîne en limitant le nombre de caractères copiés. Exemple :
- Alternative moderne : std::string::substr : En C++, il est recommandé d'utiliser std::string au lieu de strncpy pour éviter les erreurs
de gestion de mémoire. Exemple équivalent en C++ moderne :
- std::string str = "Bonjour";
- std::string sub = str.substr(0, 3);
- std::cout << sub; // Affiche "Bon"
Cela évite les problèmes de \0 manquant et simplifie la gestion mémoire.
- Utilisée pour manipuler des structures et des buffers : strncpy est souvent utilisée dans les structures pour copier des chaînes dans des tampons de taille fixe. Exemple avec une structure :
- Peut être inefficace pour de longues chaînes de caractères : strncpy remplit avec des \0 si la source est plus courte que n, ce qui peut être inutilement coûteux en termes de performances. Exemple :
Solution : Ajouter manuellement dest[n] = '\0'; après l'appel à strncpy.
Ici, dest contiendra "Hi\0\0\0\0\0\0\0\0". Cela peut être utile pour garantir une initialisation complète de la destination.
Solution : Toujours s'assurer que destination a une taille suffisante.
Cette approche est utile pour extraire des préfixes d'une chaîne de caractères.
Cela évite les dépassements et assure un bon formatage des chaînes de caractères.
Solution : Utiliser plutôt memcpy si l'on sait que la chaîne source est toujours bien formée.
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - strcpy
Langage de programmation - C - Référence de procédures et fonctions - strncpy
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 734.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 262.