C Programmation

Comment utiliser Strcpy() en langage C?

Comment utiliser Strcpy() en langage C?
Dans cet article, nous allons découvrir la fonction strcpy() dans le langage de programmation C. La fonction strcpy() est une fonction de bibliothèque standard très populaire pour effectuer l'opération de copie de chaîne dans le langage de programmation C. Il existe plusieurs fichiers d'en-tête standard dans le langage de programmation C pour effectuer des opérations standard. La « chaîne.h" est l'un de ces fichiers d'en-tête, qui fournit plusieurs fonctions de bibliothèque standard pour effectuer des opérations de chaîne. La fonction "strcpy()" est l'une des fonctions de la bibliothèque fournie par "string.h".

Syntaxe:

char* strcpy (char* destination_location, const char* source_string);

Comprendre strcpy() :

Le seul but de la fonction strcpy() est de copier une chaîne de la source à la destination. Maintenant, regardons la syntaxe ci-dessus de la fonction strcpy(). La fonction strcpy() est capable d'accepter deux paramètres -

La source est une constante ici pour s'assurer que la fonction strcpy() ne peut pas changer la chaîne source. La fonction strcpy() copie tous les caractères (y compris le caractère NULL à la fin de la chaîne) de la chaîne source vers la destination. Une fois l'opération de copie terminée de la source à la destination, la fonction strcpy() renvoie l'adresse de la destination à la fonction appelante.

Le point important à noter ici est que la fonction strcpy() n'ajoute pas la chaîne source à la chaîne de destination. Il remplace plutôt le contenu de la destination par le contenu de la chaîne source.

De plus, la fonction strcpy() n'effectue aucune vérification pour s'assurer que la taille de la destination est supérieure à la chaîne source, c'est entièrement la responsabilité du programmeur.

Exemples:

Maintenant, nous allons voir plusieurs exemples pour comprendre la fonction strcpy() :

  1. strcpy() - Fonctionnement normal (exemple1.c)
  2. strcpy() - Cas-1 (exemple2.c)
  3. strcpy() - Cas-2 (exemple3.c)
  4. strcpy() - Cas-3 (exemple4.c)
  5. strcpy() - Version définie par l'utilisateur (exemple5.c)
  6. strcpy() - Version définie par l'utilisateur optimisée (exemple6.c)

strcpy() - Fonctionnement normal (exemple1.c) :

Cet exemple de programme montre comment effectuer une opération de copie de chaîne normale à l'aide de la fonction strcpy() dans le langage de programmation C. Veuillez noter que la longueur de la chaîne de destination est de 30 (char destination_str[30]; ), ce qui est supérieur à la longueur de la chaîne source (la longueur est de 18, y compris le caractère NULL) afin que la destination puisse accueillir tous les caractères du chaîne source.

#inclure
#inclure
int main()

char source_str[] = "www.astuce linux.com" ;
car destination_str[30] ;
printf("Avant d'appeler la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
strcpy(chaîne_destination, chaîne_source);
printf("Après avoir exécuté la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
renvoie 0 ;

strcpy() - Cas-1 (exemple2.c) :

Le but de cet exemple de programme est d'expliquer clairement ce qui se passe lorsque la longueur de la chaîne de destination est inférieure à la longueur de la chaîne source. Dans de tels cas, l'emplacement de destination n'aura pas assez d'espaces/octets pour accueillir tous les caractères (y compris le caractère NULL) de la chaîne source. Deux choses que vous devez toujours garder à l'esprit :

  1. La fonction strcpy() ne vérifiera pas si la destination a suffisamment d'espace.
  2. Cela pourrait être dangereux dans les logiciels embarqués car strcpy() remplacera la zone mémoire au-delà de la limite de la destination.

Regardons l'exemple de programme. Nous avons déclaré source_str et l'avons initialisé à "www.astuce linux.com", qui prendra 18 octets en mémoire à stocker, y compris le caractère Null à la fin de la chaîne. Ensuite, nous avons déclaré un autre tableau de caractères i.e. destination_str avec la taille de seulement 5. Ainsi, destination_str ne peut pas contenir la chaîne source avec une taille totale de 18 octets.

Mais, toujours, nous appelons la fonction strcpy () pour copier la chaîne source dans la chaîne de destination. D'après la sortie ci-dessous, nous pouvons voir que strcpy() ne s'est pas plaint du tout. Dans ce cas, la fonction strcpy() commencera à copier le caractère de la chaîne source (jusqu'à ce qu'elle trouve le caractère NULL dans la chaîne source) vers l'adresse de destination (même si la limite de destination dépasse). Cela signifie que la fonction strcpy () ne fait aucune vérification des limites pour le tableau de destination. Finalement, la fonction strcpy() écrasera les adresses mémoire qui ne sont pas allouées au tableau de destination. C'est pourquoi la fonction strcpy() finira par écraser les emplacements mémoire qui pourraient être alloués à une variable différente.

Dans cet exemple, nous pouvons voir à partir de la sortie ci-dessous, que la fonction strcpy() écrase la chaîne source elle-même. Les programmeurs doivent toujours être prudents avec un tel comportement.

#inclure
#inclure
int main()

char source_str[] = "www.astuce linux.com" ;
car destination_str[5];
printf("Avant d'appeler la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
strcpy(chaîne_destination, chaîne_source);
printf("Après avoir exécuté la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
//printf("Adresse source = %u (0x%x)\n", &source_str[0], &source_str[0]);
//printf("Adresse de destination = %u (0x%x)\n", &destination_str[0], &destination_str[0]);
renvoie 0 ;

strcpy() - Cas-2 (exemple3.c) :

Ce programme illustre la situation lorsque la taille de la chaîne de destination est supérieure à la taille de la chaîne source et que la chaîne de destination est déjà initialisée avec une valeur. Dans cet exemple, nous avons initialisé :

  • chaîne_source à "www.astuce linux.com" [taille = 17+1 = 18]
  • destination_str à "I_AM_A_DESTINATION_STRING" [taille = 25+1 = 26]

La fonction strcpy() copiera tous les 17 caractères et le caractère NULL de la chaîne source vers la chaîne de destination. Mais, il ne remplacera/changera pas les octets restants (octet 19 à 26, basé sur un) dans le tableau de destination. Nous avons utilisé la boucle for pour parcourir le tableau de destination et imprimer le tableau entier pour prouver que les octets-19 à 26 sont inchangés dans le tableau de destination. C'est pourquoi nous voyons la dernière sortie comme:

"www.astuce linux.com_STRING".

#inclure
#inclure
/* Ce programme illustre la situation lorsque :
taille de la chaîne de destination > taille de la chaîne source
et nous exécutons la fonction strcpy() pour copier le
chaîne source à destination.
Remarque : La taille de la chaîne de destination doit toujours
être supérieur ou égal à la chaîne source.
*/
int main()

char source_str[] = "www.astuce linux.com" ;
car destination_str[26] = "I_AM_A_DESTINATION_STRING" ;
printf("Avant d'appeler la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
strcpy(chaîne_destination, chaîne_source);
printf("Après avoir exécuté la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
/* affiche la chaîne de destination en utilisant la boucle for*/
printf("Imprime la chaîne de destination char par char : \n\n");
printf("\tChaîne de destination = ");
for(int i=0; i<25;i++)

printf("%c", destination_str[i]);

printf("\n\n");
renvoie 0 ;

strcpy() - Cas-3 (exemple4.c) :

Nous avons considéré ce programme comme un exemple pour montrer que nous ne devrions jamais appeler strcpy() avec une chaîne littérale comme destination. Cela provoquera un comportement indéfini et éventuellement, le programme se bloquera.

#inclure
#inclure
int main()

char source_str[] = "www.astuce linux.com" ;
printf("Avant d'appeler la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
/* Ne jamais appeler strcpy() avec un littéral de chaîne comme destination.
Le programme va planter.
*/
strcpy("chaîne_destination", chaîne_source);
printf("Après avoir exécuté la fonction strcpy() : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
renvoie 0 ;

strcpy() - Version définie par l'utilisateur (exemple5.c) :

Dans cet exemple de programme, nous avons montré comment écrire une version définie par l'utilisateur de la fonction strcpy().

#inclure
char * strcpy_user_defined(char *dest, const char * src);
/* Version définie par l'utilisateur de la fonction strcpy() */
char * strcpy_user_defined(char *dest, const char * src)

char * dest_backup = dest;
tandis que(*src != '\0') /* Itérer jusqu'à ce que '\0' soit trouvé.*/

*dest = *src; /* Copier le caractère source vers la destination */
src++ ; /* Incrémenter le pointeur source */
dest++; /* Incrémenter le pointeur de destination */

*dest = '\0'; /* Insérer '\0' dans la destination explicitement*/
retourner dest_backup ;

int main()

char source_str[] = "www.astuce linux.com" ;
car destination_str[30] ;
printf("Avant d'appeler la fonction de copie de chaîne définie par l'utilisateur : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
/* Appel de la fonction de copie de chaîne définie par l'utilisateur */
strcpy_user_defined(destination_str, source_str);
printf("Après avoir exécuté la fonction de copie de chaîne définie par l'utilisateur : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
renvoie 0 ;

strcpy() - Version définie par l'utilisateur optimisée (exemple6.c) :

Maintenant, dans cet exemple de programme, nous allons optimiser la version définie par l'utilisateur de strcpy().

#inclure
char * strcpy_user_defined(char *dest, const char * src);
/* Version optimisée de la fonction strcpy() définie par l'utilisateur */
char * strcpy_user_defined(char *dest, const char * src)

char * dest_backup = dest;
while(*dest++ = *src++)
;
retourner dest_backup ;

int main()

char source_str[] = "www.astuce linux.com" ;
car destination_str[30] ;
printf("Avant d'appeler la fonction de copie de chaîne définie par l'utilisateur : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
/* Appel de la fonction de copie de chaîne définie par l'utilisateur */
strcpy_user_defined(destination_str, source_str);
printf("Après avoir exécuté la fonction de copie de chaîne définie par l'utilisateur : \n\n");
printf("\tChaîne source = %s\n", chaîne_source);
printf("\tChaîne de destination = %s\n\n", chaîne_destination);
renvoie 0 ;

Conclusion:

La fonction strcpy() est une fonction de bibliothèque très populaire et pratique pour effectuer l'opération de copie de chaîne dans le langage de programmation C. Ceci est principalement utilisé pour copier la chaîne d'un emplacement à un autre emplacement. Cependant, nous souhaitons réitérer le fait que la fonction strcpy() ne vérifie pas les limites du tableau de destination, ce qui pourrait conduire à un grave bogue logiciel si elle est ignorée. Il est toujours de la responsabilité du programmeur de s'assurer que le tableau de destination dispose de suffisamment d'espace pour contenir tous les caractères de la chaîne source, y compris le caractère NULL.

Vulkan pour les utilisateurs Linux
Avec chaque nouvelle génération de cartes graphiques, nous voyons les développeurs de jeux repousser les limites de la fidélité graphique et se rappro...
OpenTTD contre Simutrans
Créer votre propre simulation de transport peut être amusant, relaxant et extrêmement attrayant. C'est pourquoi vous devez vous assurer que vous essay...
Tutoriel OpenTTD
OpenTTD est l'un des jeux de simulation d'entreprise les plus populaires. Dans ce jeu, vous devez créer une merveilleuse entreprise de transport. Cepe...