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.Les rouages d’une entreprise se jouent rarement sous les projecteurs. Ce qui apparaît à l’extérieur…
Quand on prépare un mémoire, on consacre souvent l’essentiel de son énergie au plan, à…
Dans beaucoup d’entreprises, l’analyse financière commence souvent de la même manière : une pile de…
Télécharger une fiche méthode pratique et utile ⬇️ L’analyse de document en SVT fait partie…
Introduction En classe de 4ème, l’étude du récit occupe une place importante dans l’apprentissage du…
Télécharger un Modèle Excel de classification des documents avec suivi automatisé ⬇️ Dans toute organisation…
This website uses cookies.