En C, les fonctions strcpy et strncpy servent à copier des chaînes de caractères d’une source à une destination. Bien qu’elles soient similaires, elles diffèrent en termes de fonctionnement, sécurité, et cas d’utilisation. Ce guide explique leurs différences et propose des exemples pratiques.
strcpy\0), d’une source vers une destination.char *strcpy(char *destination, const char *source);strncpy\0 n’est pas ajouté automatiquement.char *strncpy(char *destination, const char *source, size_t n);| Aspect | strcpy | strncpy |
|---|---|---|
| Copie complète | Copie toute la chaîne jusqu’à \0. | Copie jusqu’à n caractères maximum. |
Caractère nul (\0) | Toujours ajoute \0. | N’ajoute pas \0 si la source dépasse n. |
| Sécurité | Ne vérifie pas la taille de destination. | Limite la copie pour éviter les dépassements. |
| Performance | Légèrement plus rapide (moins de vérifications). | Légèrement plus lente (vérification de limite). |
| Utilisation typique | Copie complète d’une chaîne connue pour être sûre. | Copie partielle ou sécurisée avec limite de taille. |
strcpy#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Bonjour";
char destination[10];
strcpy(destination, source); // Copie toute la chaîne
printf("Source : %s\n", source);
printf("Destination : %s\n", destination);
return 0;
}
destination est trop petite, il y a un buffer overflow.strncpy#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Bonjour";
char destination[5];
strncpy(destination, source, sizeof(destination) - 1); // Limite à 4 caractères
destination[sizeof(destination) - 1] = '\0'; // Ajouter manuellement `\0`
printf("Source : %s\n", source);
printf("Destination : %s\n", destination);
return 0;
}
\0 manuellement si nécessaire.destination est trop petitestrcpy : strncpy : n caractères, mais n’ajoute pas automatiquement le caractère nul.strncpy :Toujours ajouter \0 après la copie :
destination[n - 1] = '\0';
strcpy : strncpy : \0).#include <stdio.h>
#include <string.h>
int main() {
char source[] = "C";
char destination[5];
strncpy(destination, source, sizeof(destination)); // Remplit le reste avec `\0`
printf("Destination : ");
for (int i = 0; i < sizeof(destination); i++) {
printf("%c ", destination[i] == '\0' ? '_' : destination[i]); // Affiche `_` pour les zéros
}
printf("\n");
return 0;
}
strcpy : strncpy : n >= 1.strcpydestination est garantie suffisante pour contenir source.char destination[50];
char source[] = "Texte sûr";
if (strlen(source) < sizeof(destination)) {
strcpy(destination, source);
}
strncpydestination est limitée ou doit être respectée.source.Ajoutez toujours \0 après une copie partielle avec strncpy.
snprintfOffre une sécurité accrue en limitant la taille de la chaîne copiée tout en s’assurant qu’elle est terminée par \0.
#include <stdio.h>
int main() {
char source[] = "Bonjour";
char destination[5];
snprintf(destination, sizeof(destination), "%s", source);
printf("Destination : %s\n", destination);
return 0;
}
strlcpy (non standard, disponible sur certains systèmes)Limite la taille copiée tout en garantissant la terminaison par \0.
#include <bsd/string.h>
char destination[5];
strlcpy(destination, source, sizeof(destination));
| Critère | strcpy | strncpy |
|---|---|---|
Terminaison par \0 | Toujours | Non garanti si la source dépasse la limite |
| Gestion de dépassement | Non sécurisé, dépassement possible | Limite la copie |
| Remplissage restant | Aucun remplissage | Remplit les caractères restants avec \0 |
| Performance | Plus rapide | Légèrement plus lent |
| Utilisation idéale | Copie complète lorsque la taille est sûre | Copie partielle ou sécurisée |
strncpyAllouez un tableau dynamique pour copier une chaîne de manière sécurisée avec strncpy.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char source[] = "Programmation C";
size_t max_size = 10;
char *destination = (char *)malloc(max_size);
if (destination == NULL) {
printf("Erreur d'allocation mémoire.\n");
return 1;
}
strncpy(destination, source, max_size - 1);
destination[max_size - 1] = '\0'; // Assurez la terminaison
printf("Destination : %s\n", destination);
free(destination);
return 0;
}
strcpy et strncpyCopiez une chaîne de 15 caractères dans une destination de 10 caractères. Comparez le comportement de strcpy et strncpy.
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Chaîne très longue";
char destination1[10];
char destination2[10];
// Utilisation de strcpy (comportement indéfini)
// strcpy(destination1, source); // Peut causer un buffer overflow
// Utilisation de strncpy
strncpy(destination2, source, sizeof(destination2) - 1);
destination2[sizeof(destination2) - 1] = '\0';
printf("Avec strncpy : %s\n", destination2);
return 0;
}
strcpy : Rapide et simple, mais non sécurisé.strncpy : Plus sûr, mais nécessite une gestion manuelle de \0.strncpy pour éviter les dépassements de mémoire.\0 après une copie partielle avec strncpy.snprintf ou strlcpy si disponibles.Derrière chaque tableau électrique, chaque moteur ou chaque circuit d’alimentation se cache un élément souvent…
Une fiche de traçabilité HACCP n'attire généralement l'attention que lorsqu'une information devient difficile à retrouver.…
Deux dates figurent régulièrement sur les emballages alimentaires : la DLC et la DDM. Souvent…
Ordinateurs, imprimantes, véhicules, outils industriels, équipements informatiques, appareils de mesure ou matériels de chantier :…
Chaque produit alimentaire laisse derrière lui une multitude d'informations souvent invisibles pour le consommateur :…
La scène est familière. Un lundi matin, quelques minutes avant le début du service, un…
This website uses cookies.