Comment utiliser Strcpy dans le langage C?

Comment utiliser Strcpy dans le langage C?
Dans cet article, nous allons en apprendre davantage sur 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 bibliothèque fournies 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, nous permet de regarder la syntaxe ci-dessus de la fonction strcpy (). La fonction Strcpy () est capable d'accepter deux paramètres -

  • destination de char *
  • Source de const char *

La source est une constante ici pour s'assurer que la fonction Strcpy () ne peut pas modifier la chaîne source. La fonction strcpy () copie tous les caractères (y compris le caractère nul à la fin de la chaîne) de la chaîne source à 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 de l'appelant.

Le point important à noter ici est que la fonction strcpy () n'ajoute pas la chaîne source avec 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 garantir que la taille de la destination est plus que la chaîne source, elle est totalement la responsabilité du programmeur.

Exemples:

Maintenant, nous verrons plusieurs exemples pour comprendre la fonction Strcpy ():

  1. Strcpy () - Fonctionnement normal (Exemple1.c)
  2. strcpy () - case-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é (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 18 y compris le caractère nul) afin que la destination puisse accueillir tous les caractères des caractères chaîne source.

#inclure
#inclure
int main()

char source_str [] = "www.linuxhint.com ";
Char Destination_str [30];
printf ("Avant d'appeler Strcpy () Fonction: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("après exécution de la fonction strcpy (): \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
retour 0;

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

L'intention 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 nul) de la chaîne source. Deux choses, vous devriez 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 intégrés car le strcpy () remplacera la zone de mémoire au-delà de la limite de la destination.

Examinons le programme d'exemples. Nous avons déclaré source_str et initialisé sur «www.linuxhint.com », qui prendra 18 octets en mémoire pour stocker, y compris le caractère nul à la fin de la chaîne. Ensuite, nous avons déclaré un autre tableau de personnage I.e. Destination_Str avec la taille de seulement 5. Ainsi, la destination_str ne peut pas maintenir la chaîne source avec une taille totale de 18 octets.

Mais, encore, nous appelons la fonction Strcpy () pour copier la chaîne source en chaîne de destination. À partir de la sortie ci-dessous, nous pouvons voir que le strcpy () ne se plaignait pas du tout. Dans ce cas, la fonction strcpy () commencera à copier le caractère à partir de la chaîne source (jusqu'à ce qu'elle trouve le caractère nul dans la chaîne source) à 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 de mémoire qui ne sont pas allouées au tableau de destination. C'est pourquoi la fonction strcpy () finira par remplacer les emplacements de 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.linuxhint.com ";
Char Destination_str [5];
printf ("Avant d'appeler Strcpy () Fonction: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("après exécution de la fonction strcpy (): \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
// printf ("Source Address =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Destination Address =% u (0x% x) \ n", & destination_str [0], & Destination_str [0]);
retour 0;

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

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

  • Source_str à «www.linuxhint.com ”[taille = 17 + 1 = 18]
  • Destination_str à "i_am_a_destination_string" [size = 25 + 1 = 26]

La fonction strcpy () copiera les 17 caractères et le caractère nul de la chaîne source à la chaîne de destination. Mais, il ne remplacera / ne modifiera pas les octets restants (octets 19 à 26, un basé) dans le tableau de destination. Nous avons utilisé la boucle pour itérer sur le tableau de destination et imprimer l'ensemble du tableau pour prouver que les octets-19 à 26 sont inchangés dans le tableau de destination. C'est pourquoi nous voyons la dernière sortie:

«Www.linuxhint.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 à la 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.linuxhint.com ";
Char Destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Avant d'appeler Strcpy () Fonction: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("après exécution de la fonction strcpy (): \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Imprimer la chaîne de destination en utilisant pour Loop * /
printf ("imprimer la chaîne de destination char par char: \ n \ n");
printf ("\ tDestination String =");
pour (int i = 0; i<25;i++)

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

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

strcpy () - cas-3 (Exemple4.c):

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

#inclure
#inclure
int main()

char source_str [] = "www.linuxhint.com ";
printf ("Avant d'appeler Strcpy () Fonction: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
/ * Ne jamais appeler strcpy () avec une chaîne littérale comme destination.
Le programme se bloquera.
* /
strcpy ("destination_str", source_str);
printf ("après exécution de la fonction strcpy (): \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
retour 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 la source char à destination * /
src ++; / * Pointeur de source d'incrément * /
dest ++; / * Pointeur de destination incrément * /

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

int main()

char source_str [] = "www.linuxhint.com ";
Char Destination_str [30];
printf ("avant d'appeler la fonction de copie de chaîne définie par l'utilisateur: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Fonction de copie de chaîne définie par l'utilisateur * /
strcpy_user_defined (destination_str, source_str);
printf ("Après l'exécution de la fonction de copie de chaîne définie par l'utilisateur: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
retour 0;

Strcpy () - Version définie par l'utilisateur Optimisé (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;
tandis que (* dest ++ = * src ++)
;
return dest_backup;

int main()

char source_str [] = "www.linuxhint.com ";
Char Destination_str [30];
printf ("avant d'appeler la fonction de copie de chaîne définie par l'utilisateur: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Fonction de copie de chaîne définie par l'utilisateur * /
strcpy_user_defined (destination_str, source_str);
printf ("Après l'exécution de la fonction de copie de chaîne définie par l'utilisateur: \ n \ n");
printf ("\ tsource string =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
retour 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 endroit à un autre emplacement. Cependant, nous voulons réitérer le fait que la fonction Strcpy () ne fait pas la frontière pour vérifier le tableau de destination, ce qui pourrait conduire à un bogue logiciel sérieux s'il est ignoré. Il est toujours de la responsabilité du programmeur de s'assurer que le tableau de destination a suffisamment d'espace pour contenir tous les caractères de la chaîne source, y compris le caractère nul.