Kako uporabljati Strcpy () v jeziku C?

How Use Strcpy C Language



V tem članku se bomo naučili o funkciji strcpy () v programskem jeziku C. Funkcija strcpy () je zelo priljubljena standardna knjižnična funkcija za izvajanje operacije kopiranja niza v programskem jeziku C. Za izvajanje standardnih operacij je v programskem jeziku C več standardnih datotek z glavo. Niz string.h je ena izmed takih datotek z glavo, ki ponuja več standardnih knjižničnih funkcij za izvajanje nizov. Funkcija strcpy () je ena od knjižničnih funkcij, ki jih ponuja string.h.

Sintaksa:

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

Razumevanje strcpy ():

Edini namen funkcije strcpy () je kopiranje niza od vira do cilja. Zdaj pa poglejmo zgornjo sintakso funkcije strcpy (). Funkcija strcpy () lahko sprejme dva parametra -







  • char * destinacija
  • vir const char *

Vir je tukaj konstanta, ki zagotavlja, da funkcija strcpy () ne more spremeniti izvornega niza. Funkcija strcpy () kopira vse znake (vključno z znakom NULL na koncu niza) iz izvornega niza v cilj. Ko je operacija kopiranja končana od vira do cilja, funkcija strcpy () vrne naslov cilja nazaj klicatelju.



Pri tem je pomembno opozoriti, da funkcija strcpy () ne doda izvornega niza ciljnemu nizu. Namesto tega vsebino cilja nadomesti z vsebino izvornega niza.



Prav tako funkcija strcpy () ne izvaja nobenih preverjanj, da bi zagotovila, da je velikost cilja večja od izvornega niza, za to je v celoti odgovoren programer.





Primeri:

Zdaj bomo videli več primerov za razumevanje funkcije strcpy ():

  1. strcpy () - Normalno delovanje (primer 1.c)
  2. strcpy ()-Primer-1 (primer 2.c)
  3. strcpy ()-Primer-2 (primer 3.c)
  4. strcpy ()-Primer-3 (primer 4.c)
  5. strcpy () - Uporabniško definirana različica (example5.c)
  6. strcpy () - Uporabniško definirana različica optimizirana (example6.c)

strcpy () - Običajno delovanje (primer 1.c):

Ta primer programa prikazuje, kako izvesti običajno operacijo kopiranja niza s funkcijo strcpy () v programskem jeziku C. Upoštevajte, da je dolžina ciljnega niza 30 (char destination_str [30];), kar je večje od dolžine izvornega niza (dolžina je 18, vključno z znakom NULL), tako da lahko cilj sprejme vse znake iz izvorni niz.



#vključi
#vključi

intglavni()
{
charvir_str[] = 'www.linuxhint.com';
chardestination_str[30];

printf ('Pred klicem funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

strcpy (destination_str,vir_str);

printf ('Po izvedbi funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

vrnitev 0;
}

strcpy ()-Primer-1 (primer 2.c):

Namen tega primera programa je jasno razložiti, kaj se zgodi, ko je dolžina ciljnega niza manjša od dolžine izvornega niza. V takih primerih ciljna lokacija ne bo imela dovolj presledkov/bajtov za vse znake (vključno z znakom NULL) iz izvornega niza. Vedno morate upoštevati dve stvari:

  1. Funkcija strcpy () ne bo preverila, ali ima cilj dovolj prostora.
  2. To bi lahko bilo vdelano programsko opremo nevarno, ker bo strcpy () nadomestil pomnilniško območje onkraj meje cilja.

Poglejmo primer programa. Razglasili smo source_str in ga inicializirali v www.linuxhint.com , ki bo za shranjevanje potreboval 18 bajtov, vključno z znakom Null na koncu niza. Nato smo razglasili drugo matriko znakov, tj.

Kljub temu kličemo funkcijo strcpy () za kopiranje izvornega niza v ciljni niz. Iz spodnjega izhoda lahko vidimo, da se strcpy () sploh ni pritoževal. V tem primeru bo funkcija strcpy () začela kopirati znak iz izvornega niza (dokler ne najde znaka NULL v izvornem nizu) na ciljni naslov (čeprav ciljna meja presega). To pomeni, da funkcija strcpy () ne izvaja nobenega preverjanja meja za ciljno polje. Sčasoma bo funkcija strcpy () prepisala pomnilniške naslove, ki niso dodeljeni ciljnemu nizu. Zato bo funkcija strcpy () na koncu prepisala pomnilniške lokacije, ki so lahko dodeljene drugi spremenljivki.

V tem primeru lahko iz spodnjega izhoda vidimo, da funkcija strcpy () prepiše sam izvorni niz. Programerji morajo biti pri takem obnašanju vedno previdni.

#vključi
#vključi

intglavni()
{
charvir_str[] = 'www.linuxhint.com';
chardestination_str[5];

printf ('Pred klicem funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

strcpy (destination_str,vir_str);

printf ('Po izvedbi funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

// printf ('Izvorni naslov = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('Ciljni naslov = %u (0x %x) n', & destination_str [0], & destination_str [0]);

vrnitev 0;
}

strcpy ()-Primer-2 (primer 3.c):

Ta program ponazarja situacijo, ko je velikost ciljnega niza večja od velikosti izvornega niza in je ciljni niz že inicializiran z neko vrednostjo. V tem primeru smo inicializirali:

  • vir_str do www.linuxhint.com [velikost = 17+1 = 18]
  • cilj_str do I_AM_A_DESTINATION_STRING [velikost = 25+1 = 26]

Funkcija strcpy () bo kopirala vseh 17 znakov in znak NULL iz izvornega niza v ciljni niz. Vendar pa ne bo nadomestil/spremenil preostalih bajtov (bajtov 19 do 26, enega na osnovi) v ciljnem nizu. Za zanko smo uporabili for zanko za ponovitev ciljne matrike in natisnili celotno matriko, da dokažemo, da so bajti od 19 do 26 nespremenjeni v ciljnem nizu. Zato zadnji izid vidimo kot:

www.linuxhint.com_STRING .

#vključi
#vključi


/* Ta program ponazarja stanje, ko:

velikost ciljnega niza> velikost izvornega niza

in izvedemo funkcijo strcpy () za kopiranje datoteke
izvorni niz do cilja.

Opomba: Velikost ciljnega niza mora biti vedno
biti večji ali enak izvornemu nizu.
* /

intglavni()
{
charvir_str[] = 'www.linuxhint.com';
chardestination_str[26] = 'I_AM_A_DESTINATION_STRING';

printf ('Pred klicem funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

strcpy (destination_str,vir_str);

printf ('Po izvedbi funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);


/* natisnite ciljni niz z uporabo zanke*/
printf ('Natisnite ciljni niz char s char: n n');
printf (' tCiljni niz = ');

za(intjaz=0;jaz<25;jaz++)
{
printf ('% c',destination_str[jaz]);
}
printf (' n n');

vrnitev 0;
}

strcpy ()-Primer-3 (primer 4.c):

Ta program smo obravnavali kot primer, ki dokazuje, da nikoli ne smemo klicati strcpy () z nizom kot cilj. To bo povzročilo nedoločeno vedenje in sčasoma se bo program zrušil.

#vključi
#vključi

intglavni()
{
charvir_str[] = 'www.linuxhint.com';

printf ('Pred klicem funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);

/* Nikoli ne kličite strcpy () s črko niza kot cilj.
Program se bo zrušil.
* /

strcpy ('destination_str',vir_str);

printf ('Po izvedbi funkcije strcpy (): n n');
printf (' tIzvorni niz = %s n',vir_str);

vrnitev 0;
}

strcpy () - Uporabniško definirana različica (example5.c):

V tem primeru smo pokazali, kako napisati uporabniško definirano različico funkcije strcpy ().

#vključi
char *strcpy_user_defined(char *dest, const char *src);

/ * Uporabniško določena različica funkcije strcpy () */
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backup=dest;

medtem(*src! = ' 0') /* Ponavljajte, dokler ne najdete ' 0'.*/
{
*dest= *src; / * Kopirajte izvorni znak na cilj */
src++; / * Povečaj kazalec vira */
dest++; / * Povečaj ciljni kazalec */
}

*dest= ' 0'; /* V cilj natančno vstavite ' 0'*/

vrnitevdest_backup;
}

intglavni()
{
charvir_str[] = 'www.linuxhint.com';
chardestination_str[30];

printf ('Preden pokličete uporabniško določeno funkcijo kopiranja niza: n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

/ * Klicanje uporabniško določene funkcije kopiranja niza */
strcpy_user_defined(destination_str,vir_str);

printf ('Po izvedbi uporabniško določene funkcije kopiranja niza: n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

vrnitev 0;
}

strcpy () - Uporabniško definirana različica optimizirana (example6.c):

Zdaj bomo v tem primeru programa optimizirali uporabniško definirano različico strcpy ().

#vključi
char *strcpy_user_defined(char *dest, const char *src);


/ * Optimizirana različica uporabniško določene funkcije strcpy () */
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backup=dest;

medtem(*dest++ = *src++)
;

vrnitevdest_backup;
}

intglavni()
{
charvir_str[] = 'www.linuxhint.com';
chardestination_str[30];

printf ('Preden pokličete uporabniško določeno funkcijo kopiranja niza: n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

/ * Klicanje uporabniško določene funkcije kopiranja niza */
strcpy_user_defined(destination_str,vir_str);

printf ('Po izvedbi uporabniško določene funkcije kopiranja niza: n n');
printf (' tIzvorni niz = %s n',vir_str);
printf (' tCiljni niz = %s n n',destination_str);

vrnitev 0;
}

Zaključek :

Funkcija strcpy () je zelo priljubljena in priročna knjižnična funkcija za izvajanje operacije kopiranja niza v programskem jeziku C. To se večinoma uporablja za kopiranje niza z enega mesta na drugo. Vendar želimo ponoviti dejstvo, da funkcija strcpy () ne izvaja mejnega preverjanja za ciljno polje, kar bi lahko pri zanemarjanju povzročilo resno programsko napako. Programer je vedno odgovoren za to, da ima ciljno polje dovolj prostora za vse znake iz izvornega niza, vključno z znakom NULL.