Programare C

Cum se folosește Strcpy () în limbajul C?

Cum se folosește Strcpy () în limbajul C?
În acest articol, vom afla despre funcția strcpy () în limbajul de programare C. Funcția strcpy () este o funcție de bibliotecă standard foarte populară pentru a efectua operația de copiere șir în limbajul de programare C. Există mai multe fișiere antet standard în limbajul de programare C pentru a efectua operațiuni standard. Șirul.h ”este unul dintre aceste fișiere antet, care oferă mai multe funcții standard de bibliotecă pentru a efectua operații de șir. Funcția „strcpy ()” este una dintre funcțiile de bibliotecă oferite de „șir.h ”.

Sintaxă:

char * strcpy (char * destinație_locare, const char * sursă_string);

Înțelegerea strcpy ():

Singurul scop al funcției strcpy () este de a copia un șir de la sursă la destinație. Acum, să ne uităm la sintaxa de mai sus a funcției strcpy (). Funcția strcpy () este capabilă să accepte doi parametri -

Sursa este o constantă aici pentru a ne asigura că funcția strcpy () nu poate modifica șirul sursă. Funcția strcpy () copiază toate caracterele (inclusiv caracterul NULL la sfârșitul șirului) din șirul sursă la destinație. Odată ce operațiunea de copiere este finalizată de la sursă la destinație, funcția strcpy () returnează adresa destinației înapoi la funcția apelantului.

Punctul important de remarcat aici este că funcția strcpy () nu adaugă șirul sursă cu șirul de destinație. Mai degrabă înlocuiește conținutul destinației cu conținutul șirului sursă.

De asemenea, funcția strcpy () nu efectuează nicio verificare pentru a se asigura că dimensiunea destinației este mai mare decât șirul sursă, este complet responsabilitatea programatorului.

Exemple:

Acum, vom vedea mai multe exemple pentru a înțelege funcția strcpy ():

  1. strcpy () - Operațiune normală (exemplu1.c)
  2. strcpy () - Caz-1 (exemplu2.c)
  3. strcpy () - Caz-2 (exemplu3.c)
  4. strcpy () - Caz-3 (exemplu4.c)
  5. strcpy () - Versiune definită de utilizator (exemplu5.c)
  6. strcpy () - Versiune definită de utilizator optimizată (exemplu6.c)

strcpy () - Operațiune normală (exemplu1.c):

Acest exemplu de program arată cum să efectuați o operație normală de copiere a șirurilor utilizând funcția strcpy () în limbajul de programare C. Vă rugăm să rețineți că lungimea șirului de destinație este 30 (char destination_str [30];), care este mai mare decât lungimea șirului sursă (lungimea este 18 inclusiv caracterul NULL), astfel încât destinația să poată găzdui toate caracterele din șir de sursă.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Înainte de a apela funcția strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("După executarea funcției strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
retur 0;

strcpy () - Caz-1 (exemplu2.c):

Intenția acestui exemplu de program este de a explica clar ce se întâmplă atunci când lungimea șirului de destinație este mai mică decât lungimea șirului sursă. În astfel de cazuri, locația de destinație nu va avea suficiente spații / octeți pentru a găzdui toate caracterele (inclusiv caracterul NULL) din șirul sursă. Două lucruri pe care trebuie să le ții cont întotdeauna:

  1. Funcția strcpy () nu va verifica dacă destinația are suficient spațiu.
  2. Acest lucru ar putea fi periculos în software-ul încorporat, deoarece strcpy () va înlocui zona de memorie dincolo de limita destinației.

Să ne uităm la exemplul de program. Am declarat source_str și l-am inițializat la „www.linuxhint.com ”, care va dura 18 octeți în memorie, inclusiv caracterul Null de la sfârșitul șirului. Apoi, am declarat o altă matrice de caractere i.e. destination_str cu dimensiunea de doar 5. Deci, destination_str nu poate conține șirul sursă cu o dimensiune totală de 18 octeți.

Dar, totuși, apelăm funcția strcpy () pentru a copia șirul sursă în șirul de destinație. Din rezultatul de mai jos, putem vedea că strcpy () nu s-a plâns deloc. În acest caz, funcția strcpy () va începe să copieze caracterul din șirul sursă (până când va găsi caracterul NULL în șirul sursă) la adresa de destinație (chiar dacă limita de destinație depășește). Asta înseamnă că funcția strcpy () nu face nicio verificare a limitelor pentru matricea de destinație. În cele din urmă, funcția strcpy () va suprascrie adresele de memorie care nu sunt alocate matricei de destinație. Acesta este motivul pentru care funcția strcpy () va sfârși prin a suprascrie locațiile de memorie care ar putea fi alocate unei variabile diferite.

În acest exemplu, putem vedea din rezultatul de mai jos, că funcția strcpy () suprascrie șirul sursă în sine. Programatorii ar trebui să fie întotdeauna atenți la un astfel de comportament.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [5];
printf ("Înainte de a apela funcția strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("După executarea funcției strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
// printf ("Adresa sursă =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Adresa destinației =% u (0x% x) \ n", & destination_str [0], & destination_str [0]);
retur 0;

strcpy () - Caz-2 (exemplu3.c):

Acest program ilustrează situația în care dimensiunea șirului de destinație este mai mare decât dimensiunea șirului de sursă și șirul de destinație este deja inițializat cu o anumită valoare. În acest exemplu, am inițializat:

  • sursă_str la „www.linuxhint.com ”[dimensiune = 17 + 1 = 18]
  • destinație_str la „I_AM_A_DESTINATION_STRING” [dimensiune = 25 + 1 = 26]

Funcția strcpy () va copia toate cele 17 caractere și caracterul NULL din șirul sursă în șirul de destinație. Dar nu va înlocui / modifica restul de octeți (octeții 19-26, unul bazat) în matricea de destinație. Am folosit pentru buclă pentru a itera peste matricea de destinație și pentru a imprima întreaga matrice pentru a demonstra că octeții-19 până la 26 sunt neschimbați în matricea de destinație. De aceea vedem ultima ieșire ca:

„Www.linuxhint.com_STRING ”.

#include
#include
/ * Acest program ilustrează situația când:
dimensiunea șirului de destinație> dimensiunea șirului sursă
și executăm funcția strcpy () pentru a copia fișierul
șir sursă la destinație.
Notă: dimensiunea șirului de destinație trebuie întotdeauna
să fie mai mare sau egal cu șirul sursă.
* /
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Înainte de a apela funcția strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("După executarea funcției strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * tipăriți șirul de destinație utilizând bucla pentru
printf ("Imprimați șirul de destinație char după char: \ n \ n");
printf ("\ tDestination String =");
pentru (int i = 0; i<25;i++)

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

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

strcpy () - Caz-3 (exemplu4.c):

Am considerat acest program ca un exemplu pentru a arăta că nu ar trebui să apelăm niciodată strcpy () cu un șir literal ca destinație. Acest lucru va provoca un comportament nedefinit și, în cele din urmă, programul se va prăbuși.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Înainte de a apela funcția strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
/ * Nu apelați niciodată strcpy () cu șir literal ca destinație.
Programul se va prăbuși.
* /
strcpy ("destination_str", source_str);
printf ("După executarea funcției strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
retur 0;

strcpy () - Versiune definită de utilizator (exemplu5.c):

În acest exemplu de program, am arătat cum să scriem o versiune definită de utilizator a funcției strcpy ().

#include
char * strcpy_user_defined (char * dest, const char * src);
/ * Versiunea definită de utilizator a funcției strcpy () * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
while (* src != '\ 0') / * Iterează până când se găsește '\ 0'.* /

* dest = * src; / * Copiați caracterul sursă la destinație * /
src ++; / * Pointer sursa de incrementare * /
dest ++; / * Incrementarea indicatorului de destinație * /

* dest = '\ 0'; / * Introduceți în mod explicit „\ 0” în destinație * /
returnează dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Înainte de a apela funcția de copiere șir definită de utilizator: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Apelarea funcției de copiere șir definită de utilizator * /
strcpy_user_defined (destination_str, source_str);
printf ("După executarea funcției de copiere șir definită de utilizator: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
retur 0;

strcpy () - Versiune definită de utilizator optimizată (exemplu6.c):

Acum, în acest exemplu de program, vom optimiza versiunea definită de utilizator a strcpy ().

#include
char * strcpy_user_defined (char * dest, const char * src);
/ * Versiunea optimizată a funcției definite de utilizator strcpy () * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
while (* dest ++ = * src ++)
;
returnează dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Înainte de a apela funcția de copiere șir definită de utilizator: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Apelarea funcției de copiere șir definită de utilizator * /
strcpy_user_defined (destination_str, source_str);
printf ("După executarea funcției de copiere șir definită de utilizator: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
retur 0;

Concluzie:

Funcția strcpy () este o funcție de bibliotecă foarte populară și utilă pentru a efectua operația de copiere șir în limbajul de programare C. Acesta este utilizat în principal pentru a copia șirul dintr-o locație în alta locație. Cu toate acestea, dorim să reiterăm faptul că funcția strcpy () nu face verificarea limitelor pentru matricea de destinație, ceea ce ar putea duce la o eroare software gravă dacă este ignorată. Este întotdeauna responsabilitatea programatorului să se asigure că matricea de destinație are suficient spațiu pentru a conține toate caracterele din șirul sursă, inclusiv caracterul NULL.

Cum se utilizează AutoKey pentru automatizarea jocurilor Linux
AutoKey este un utilitar de automatizare desktop pentru Linux și X11, programat în Python 3, GTK și Qt. Folosind funcțiile sale de scriptare și MACRO,...
Cum se arată FPS Counter în jocurile Linux
Jocurile cu Linux au primit un impuls major când Valve a anunțat suportul Linux pentru clientul Steam și jocurile acestora în 2012. De atunci, multe j...
How to download and Play Sid Meier's Civilization VI on Linux
Introduction to the game Civilization 6 is a modern take on the classic concept introduced in the series of the Age of Empires games. The idea was fai...