La fonction strcpy en C est utilisée pour copier une chaîne de caractères d’une source vers une destination. Ce guide explique son fonctionnement, ses utilisations, ses limites, et propose des exemples pratiques.
strcpychar *strcpy(char *destination, const char *source); \0) de fin.destination : Pointeur vers le tableau où la chaîne sera copiée.source : Pointeur vers la chaîne à copier.destination.source.destination.\0) à la fin.destination doit être suffisamment grande pour contenir :source.#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Bonjour";
char destination[20]; // Assez d'espace pour la chaîne
strcpy(destination, source);
printf("Source : %s\n", source);
printf("Destination : %s\n", destination);
return 0;
} Sortie :
Source : Bonjour
Destination : Bonjour Si l’espace alloué pour destination est insuffisant, cela peut provoquer un dépassement de mémoire (buffer overflow), entraînant des comportements imprévisibles.
Exemple problématique :
char source[] = "Très long texte";
char destination[5]; // Pas assez d'espace
strcpy(destination, source); // Comportement indéfini ! Solution : Assurez-vous que destination dispose d’assez d’espace :
char destination[50]; // Taille appropriée Si source est une chaîne vide (""), destination contiendra uniquement le caractère nul (\0).
Exemple :
char source[] = "";
char destination[10];
strcpy(destination, source);
printf("Source : '%s'\n", source);
printf("Destination : '%s'\n", destination); // Destination est vide Sortie :
Source : ''
Destination : '' Si source et destination pointent vers le même emplacement, strcpy fonctionnera correctement. Cependant, évitez cette situation dans la pratique.
strcpystrcpy ne vérifie pas si destination peut contenir source, ce qui peut causer des dépassements de mémoire.strncpy ou assurez-vous que destination est suffisamment grand.Exemple avec strncpy :
#include <string.h>
char destination[10];
strncpy(destination, source, sizeof(destination) - 1);
destination[sizeof(destination) - 1] = '\0'; // Assurez-vous que la chaîne est terminée par '\0' Un dépassement de mémoire peut entraîner un écrasement de données, des plantages, ou des failles de sécurité.
strcpystrncpy char *strncpy(char *destination, const char *source, size_t n); strlcpy (dans certains environnements)destination. size_t strlcpy(char *destination, const char *source, size_t size); snprintf pour une sécurité accrue snprintf(destination, sizeof(destination), "%s", source); Allouez deux tableaux statiques et copiez une chaîne dans le second.
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Copie réussie";
char destination[20];
strcpy(destination, source);
printf("Source : %s\n", source);
printf("Destination : %s\n", destination);
return 0;
} Copiez une chaîne seulement si l’espace alloué est suffisant.
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Texte";
char destination[5]; // Destination trop petite
if (strlen(source) < sizeof(destination)) {
strcpy(destination, source);
printf("Copie réussie : %s\n", destination);
} else {
printf("Erreur : Espace insuffisant.\n");
}
return 0;
} Copiez seulement les 4 premiers caractères d’une chaîne.
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Exemple de chaîne";
char destination[5];
strncpy(destination, source, 4);
destination[4] = '\0'; // Ajouter le caractère nul manuellement
printf("Destination : %s\n", destination);
return 0;
} Vérifiez la taille de destination :
destination est suffisamment grand.Préférez strncpy ou snprintf :
Évitez les dépassements de mémoire :
strcpy et strncpy ?strcpy : Copie la chaîne entière, y compris \0, mais sans vérifier la taille.strncpy : Copie un nombre maximum de caractères, mais n’ajoute pas toujours le caractère nul si la source dépasse la limite.source ou destination est NULL ?source ou destination est NULL, le comportement est indéfini et le programme peut planter.strcpystrcpystrcpy peut être utilisé pour gérer plusieurs chaînes dans un programme, comme dans une liste ou une table de chaînes.
#include <stdio.h>
#include <string.h>
int main() {
char *strings[3];
char buffer[50];
// Allocation et copie de plusieurs chaînes
for (int i = 0; i < 3; i++) {
printf("Entrez une chaîne : ");
fgets(buffer, sizeof(buffer), stdin); // Lecture de la chaîne
buffer[strcspn(buffer, "\n")] = '\0'; // Retirer le caractère de fin de ligne
strings[i] = (char *)malloc(strlen(buffer) + 1); // Allocation dynamique
if (strings[i] == NULL) {
printf("Erreur d'allocation mémoire.\n");
return 1;
}
strcpy(strings[i], buffer); // Copie dans la table
}
// Affichage des chaînes
printf("\nChaînes enregistrées :\n");
for (int i = 0; i < 3; i++) {
printf("Chaîne %d : %s\n", i + 1, strings[i]);
free(strings[i]); // Libération de la mémoire
}
return 0;
}
strcpy et strcatstrcpy est souvent utilisé avec strcat pour créer une nouvelle chaîne à partir de plusieurs chaînes.
#include <stdio.h>
#include <string.h>
int main() {
char part1[] = "Bonjour, ";
char part2[] = "comment ";
char part3[] = "ça va ?";
char result[50];
// Copier et concaténer les chaînes
strcpy(result, part1);
strcat(result, part2);
strcat(result, part3);
printf("Résultat : %s\n", result);
return 0;
}
Vous pouvez conditionnellement copier une chaîne si elle répond à certains critères, comme une longueur spécifique ou un contenu particulier.
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Programmation en C";
char destination[20];
// Condition : copier uniquement si la longueur est inférieure à 20
if (strlen(source) < sizeof(destination)) {
strcpy(destination, source);
printf("Copie réussie : %s\n", destination);
} else {
printf("La chaîne source est trop longue pour être copiée.\n");
}
return 0;
}
Dans des programmes complexes, strcpy est souvent utilisé pour copier des chaînes dans les champs d’une structure.
#include <stdio.h>
#include <string.h>
typedef struct {
char name[50];
int age;
} Person;
int main() {
Person p1;
// Copier des données dans la structure
strcpy(p1.name, "Alice");
p1.age = 25;
printf("Nom : %s, Âge : %d\n", p1.name, p1.age);
return 0;
}
Si la chaîne source dépasse la taille allouée pour destination, cela peut écraser d’autres données en mémoire.
strncpy#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Chaîne très longue";
char destination[10];
// Utilisation de strncpy pour limiter la copie
strncpy(destination, source, sizeof(destination) - 1);
destination[sizeof(destination) - 1] = '\0'; // Terminaison sécurisée
printf("Destination : %s\n", destination);
return 0;
}
Lorsque vous utilisez strcpy avec des allocations dynamiques, vous devez vous assurer que la mémoire est correctement allouée et libérée.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char source[] = "Dynamique";
char *destination;
// Allocation dynamique
destination = (char *)malloc(strlen(source) + 1);
if (destination == NULL) {
printf("Erreur d'allocation mémoire.\n");
return 1;
}
// Copie de la chaîne
strcpy(destination, source);
printf("Destination : %s\n", destination);
// Libération de la mémoire
free(destination);
return 0;
}
Si l’un des arguments de strcpy est NULL, le programme risque de planter.
#include <stdio.h>
#include <string.h>
int main() {
char *source = NULL;
char destination[20];
if (source == NULL) {
printf("La chaîne source est NULL. Impossible de copier.\n");
} else {
strcpy(destination, source);
printf("Destination : %s\n", destination);
}
return 0;
}
Copier des données saisies par l’utilisateur dans une structure ou un tableau.
#include <stdio.h>
#include <string.h>
int main() {
char input[50];
char processed[50];
printf("Entrez une chaîne : ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0'; // Suppression du caractère de fin de ligne
strcpy(processed, input);
printf("Vous avez saisi : %s\n", processed);
return 0;
}
Assembler un chemin de fichier à partir de plusieurs chaînes.
#include <stdio.h>
#include <string.h>
int main() {
char directory[] = "/home/user/";
char filename[] = "document.txt";
char filepath[100];
strcpy(filepath, directory);
strcat(filepath, filename);
printf("Chemin du fichier : %s\n", filepath);
return 0;
}
strcpydestination : destination peut contenir source et le caractère nul (\0).strncpy ou snprintf dans des scénarios critiques : source ou destination.strcpy, n’oubliez pas de libérer la mémoire après utilisation.Dans toute organisation moderne — entreprise, association, service administratif ou bureau de projet — la…
Dans la pratique comptable, le bilan constitue l’un des documents les plus fondamentaux pour comprendre…
L’analyse linéaire impressionne souvent plus qu’elle ne le devrait. Au moment d’aborder l’oral du bac…
L’analyse linéaire occupe une place centrale à l’oral du bac français. C’est l’exercice qui permet…
Créer une fiche de suivi claire et adaptée à son activité prend souvent plus de…
Comment améliorer sa condition physique tout en travaillant la technique Quand on parle de préparation…
This website uses cookies.