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.Prendre une décision d’investissement n’a jamais été un simple exercice arithmétique. Derrière chaque projet se…
Quand on parle de nature des mots, beaucoup d’élèves ont l’impression d’entrer dans un chapitre…
Si la trigonométrie te paraît floue, rassure-toi : en 3ème, elle repose sur quelques réflexes…
Si vous voulez connaître votre signe chinois sans passer par des tableaux interminables, vous êtes…
Quand on finance une voiture, tout le monde voit à peu près de quoi il…
On connaît tous ce moment : on tombe sur une offre de leasing “à partir…
This website uses cookies.