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.
strcpy
char *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.
strcpy
strcpy
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é.
strcpy
strncpy
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.strcpy
strcpy
strcpy
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 strcat
strcpy
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;
}
strcpy
destination
: 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.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…
La fiche de parrainage est bien plus qu’un simple document administratif. Elle constitue un outil…
La tenue de registres est une méthode essentielle pour organiser et gérer des informations de…
This website uses cookies.