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

How Use Strcpy C Language



Î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. Stringul.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 string.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 -







  • char * destinație
  • const char * sursă

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 observat 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 șir 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 sursă.



#include
#include

intprincipal()
{
charsursă_str[] = „www.linuxhint.com”;
chardestinație_str[30];

printf ('Înainte de a apela funcția strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

strcpy (destinație_str,sursă_str);

printf („După executarea funcției strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

întoarcere 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 suficient 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 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, adică destination_str cu dimensiunea de numai 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 ieșirea 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 găsește 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 efectuează 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

intprincipal()
{
charsursă_str[] = „www.linuxhint.com”;
chardestinație_str[5];

printf ('Înainte de a apela funcția strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

strcpy (destinație_str,sursă_str);

printf („După executarea funcției strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_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]);

întoarcere 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 bucla pentru a itera peste matricea de destinație și pentru a imprima întreaga matrice pentru a dovedi că octeții-19 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ă.
* /

intprincipal()
{
charsursă_str[] = „www.linuxhint.com”;
chardestinație_str[26] = „I_AM_A_DESTINATION_STRING”;

printf ('Înainte de a apela funcția strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

strcpy (destinație_str,sursă_str);

printf („După executarea funcției strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);


/ * tipăriți șirul de destinație folosind bucla pentru * /
printf ('Tipăriți șirul de destinație char după char: n n');
printf (' tȘir de destinație = ');

pentru(inteu=0;eu<25;eu++)
{
printf („% c”,destinație_str[eu]);
}
printf (' n n');

întoarcere 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

intprincipal()
{
charsursă_str[] = „www.linuxhint.com”;

printf ('Înainte de a apela funcția strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);

/ * Nu apelați niciodată strcpy () cu șir literal ca destinație.
Programul se va prăbuși.
* /

strcpy ('destination_str',sursă_str);

printf („După executarea funcției strcpy (): n n');
printf (' tȘir de sursă =% s n',sursă_str);

întoarcere 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;

in timp ce(*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 „ 0” în destinație în mod explicit * /

întoarceredest_backup;
}

intprincipal()
{
charsursă_str[] = „www.linuxhint.com”;
chardestinație_str[30];

printf („Înainte de a apela funcția de copiere șir definită de utilizator: n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

/ * Apelarea funcției de copiere șir definită de utilizator * /
strcpy_user_defined(destinație_str,sursă_str);

printf („După executarea funcției de copiere șir definită de utilizator: n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

întoarcere 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;

in timp ce(*dest++ = *src++)
;

întoarceredest_backup;
}

intprincipal()
{
charsursă_str[] = „www.linuxhint.com”;
chardestinație_str[30];

printf („Înainte de a apela funcția de copiere șir definită de utilizator: n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

/ * Apelarea funcției de copiere șir definită de utilizator * /
strcpy_user_defined(destinație_str,sursă_str);

printf („După executarea funcției de copiere șir definită de utilizator: n n');
printf (' tȘir de sursă =% s n',sursă_str);
printf (' tȘir de destinație =% s n n',destinație_str);

întoarcere 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.