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
.strcpy
destination
est garantie suffisante pour contenir source
.char destination[50];
char source[] = "Texte sûr";
if (strlen(source) < sizeof(destination)) {
strcpy(destination, source);
}
strncpy
destination
est limitée ou doit être respectée.source
.Ajoutez toujours \0
après une copie partielle avec strncpy
.
snprintf
Offre 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 |
strncpy
Allouez 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 strncpy
Copiez 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 écarts sur charges fixes permettent d'analyser les différences entre les charges fixes budgétées et…
L’écart-type est une mesure de la dispersion des données autour de la moyenne. Excel propose…
Exercice 1 : Calcul des Écarts sur Volume et Prix Contexte :Une entreprise a prévu…
1. Généralités sur le Contrôle Budgétaire Question 1 : Quel est l’objectif principal du contrôle…
Voici un QCM Contrôle de Gestion - Pilotage de la Performance bien conçu sur le…
Une fiche d’action est un outil essentiel pour planifier, suivre et gérer les tâches dans…
This website uses cookies.