C Programovanie

Ako používať Strcpy () v jazyku C?

Ako používať Strcpy () v jazyku C?
V tomto článku sa dozvieme o funkcii strcpy () v programovacom jazyku C. Funkcia strcpy () je veľmi populárna štandardná knižničná funkcia na vykonávanie operácie kopírovania reťazca v programovacom jazyku C. Existuje niekoľko štandardných hlavičkových súborov v programovacom jazyku C na vykonávanie štandardných operácií. „Reťazec.h ”je jeden z takýchto hlavičkových súborov, ktorý poskytuje niekoľko štandardných knižničných funkcií na vykonávanie operácií s reťazcami. Funkcia „strcpy ()“ je jednou z funkcií knižnice poskytovaných „reťazcom.h “.

Syntax:

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

Pochopenie strcpy ():

Jediným účelom funkcie strcpy () je skopírovať reťazec zo zdroja do cieľa. Teraz sa pozrime na vyššie uvedenú syntax funkcie strcpy (). Funkcia strcpy () je schopná prijať dva parametre -

Zdroj je tu konštanta, ktorá zaisťuje, že funkcia strcpy () nemôže zmeniť zdrojový reťazec. Funkcia strcpy () skopíruje všetky znaky (vrátane znaku NULL na konci reťazca) zo zdrojového reťazca do cieľa. Po dokončení operácie kopírovania zo zdroja do cieľa funkcia strcpy () vráti adresu cieľa späť do funkcie volajúceho.

Dôležitým bodom, ktorý si tu treba všimnúť, je, že funkcia strcpy () nepripojí zdrojový reťazec k cieľovému reťazcu. Namiesto toho nahradí obsah cieľového miesta obsahom zdrojového reťazca.

Funkcia strcpy () taktiež nevykonáva žiadne kontroly, aby sa ubezpečila, že veľkosť cieľa je väčšia ako zdrojový reťazec, je to úplne zodpovednosť programátora.

Príklady:

Teraz uvidíme niekoľko príkladov na pochopenie funkcie strcpy ():

  1. strcpy () - Normálna prevádzka (príklad1.c)
  2. strcpy () - Prípad 1 (príklad2.c)
  3. strcpy () - Prípad 2 (príklad3.c)
  4. strcpy () - Prípad 3 (príklad4.c)
  5. strcpy () - Verzia definovaná používateľom (príklad5.c)
  6. strcpy () - optimalizovaná verzia definovaná používateľom (príklad6.c)

strcpy () - Normálna prevádzka (príklad1.c):

Tento príkladový program ukazuje, ako vykonať normálnu operáciu kopírovania reťazca pomocou funkcie strcpy () v programovacom jazyku C. Vezmite prosím na vedomie, že dĺžka cieľového reťazca je 30 (char destination_str [30];), čo je väčšia ako dĺžka zdrojového reťazca (dĺžka je 18 vrátane znaku NULL), aby sa do cieľa mohli zmestiť všetky znaky z zdrojový reťazec.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Pred volaním funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
strcpy (destination_str, source_str);
printf ("Po vykonani funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
návrat 0;

strcpy () - Prípad 1 (príklad2.c):

Účelom tohto ukážkového programu je jasne vysvetliť, čo sa stane, keď je dĺžka cieľového reťazca menšia ako dĺžka zdrojového reťazca. V takýchto prípadoch nebude mať cieľové umiestnenie dostatok medzier / bajtov na umiestnenie všetkých znakov (vrátane znaku NULL) zo zdrojového reťazca. Vždy by ste mali mať na pamäti dve veci:

  1. Funkcia strcpy () nebude kontrolovať, či má cieľ dostatok miesta.
  2. To by mohlo byť vo vstavanom softvéri nebezpečné, pretože strcpy () nahradí oblasť pamäte za hranicou cieľa.

Pozrime sa na ukážkový program. Deklarovali sme source_str a inicializovali sme ho na „www.linuxhint.com “, ktorého uloženie bude trvať 18 bajtov, vrátane znaku Null na konci reťazca. Potom sme deklarovali ďalšie pole znakov i.e. destination_str s veľkosťou iba 5. Takže destination_str nemôže obsahovať zdrojový reťazec s celkovou veľkosťou 18 bajtov.

Stále však voláme funkciu strcpy () na kopírovanie zdrojového reťazca do cieľového reťazca. Z nižšie uvedeného výstupu vidíme, že sa strcpy () vôbec nesťažoval. V takom prípade začne funkcia strcpy () kopírovať znak zo zdrojového reťazca (kým nenájde znak NULL v zdrojovom reťazci) na cieľovú adresu (aj keď hranica cieľa presahuje). To znamená, že funkcia strcpy () nerobí žiadnu hraničnú kontrolu cieľového poľa. Funkcia strcpy () nakoniec prepíše adresy pamäte, ktoré nie sú pridelené cieľovému poľu. To je dôvod, prečo funkcia strcpy () skončí prepísaním pamäťových miest, ktoré by mohli byť pridelené inej premennej.

V tomto príklade z nižšie uvedeného výstupu vidíme, že funkcia strcpy () prepíše samotný zdrojový reťazec. Programátori by s takýmto správaním mali byť vždy opatrní.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [5];
printf ("Pred volaním funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
strcpy (destination_str, source_str);
printf ("Po vykonani funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
// printf ("Zdrojová adresa =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Cieľová adresa =% u (0x% x) \ n", & destination_str [0], & destination_str [0]);
návrat 0;

strcpy () - Prípad 2 (príklad3.c):

Tento program ilustruje situáciu, keď je veľkosť cieľového reťazca väčšia ako veľkosť zdrojového reťazca a cieľový reťazec je už inicializovaný s určitou hodnotou. V tomto príklade sme inicializovali:

  • source_str do „www.linuxhint.com ”[veľkosť = 17 + 1 = 18]
  • destination_str na „I_AM_A_DESTINATION_STRING“ [veľkosť = 25 + 1 = 26]

Funkcia strcpy () skopíruje všetkých 17 znakov a znak NULL zo zdrojového reťazca do cieľového reťazca. Nenahradí ale ani nezmení zostávajúce bajty (bajt 19 až 26, jeden založený) v cieľovom poli. Použili sme cyklus loop na iteráciu nad cieľovým poľom a vytlačenie celého poľa, aby sme dokázali, že bajty-19 až 26 sa v cieľovom poli nezmenili. Preto vidíme posledný výstup ako:

„Www.linuxhint.com_STRING ”.

#include
#include
/ * Tento program ilustruje situáciu, keď:
veľkosť cieľového reťazca> veľkosť zdrojového reťazca
a vykonáme funkciu strcpy () na skopírovanie súboru
zdrojový reťazec do cieľa.
Poznámka: Veľkosť cieľového reťazca by mala byť vždy
byť väčší alebo rovný zdrojovému reťazcu.
* /
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Pred volaním funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
strcpy (destination_str, source_str);
printf ("Po vykonani funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
/ * tlač cieľového reťazca pomocou cyklu for * /
printf ("Vytlačiť cieľový reťazec char po char: \ n \ n");
printf ("\ tReťazec cieľa =");
pre (int i = 0; i<25;i++)

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

printf ("\ n \ n");
návrat 0;

strcpy () - Prípad 3 (príklad4.c):

Tento program sme považovali za príklad, ktorý ukazuje, že nikdy by sme nemali volať strcpy () s reťazcovým literálom ako cieľ. To spôsobí nedefinované správanie a nakoniec dôjde k zlyhaniu programu.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Pred volaním funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
/ * Nikdy nevolajte strcpy () s reťazcovým literálom ako cieľ.
Program zlyhá.
* /
strcpy ("destination_str", source_str);
printf ("Po vykonani funkcie strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
návrat 0;

strcpy () - Verzia definovaná používateľom (príklad5.c):

V tomto príklade programu sme si ukázali, ako napísať používateľom definovanú verziu funkcie strcpy ().

#include
char * strcpy_user_defined (char * dest, const char * src);
/ * Užívateľom definovaná verzia funkcie strcpy () * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
while (* src != '\ 0') / * Iterujte, kým sa nenájde '\ 0'.* /

* dest = * src; / * Skopírujte zdrojový znak na miesto určenia * /
src ++; / * Ukazovateľ prírastku zdroja * /
dest ++; / * Prírastok cieľového ukazovateľa * /

* dest = '\ 0'; / * Vložte do cieľa výslovne „\ 0“ * /
return dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Pred volaním používateľom definovanej funkcie kopírovania reťazcov: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľ_str);
/ * Volanie používateľom definovanej funkcie kopírovania reťazcov * /
strcpy_user_defined (destination_str, source_str);
printf ("Po vykonaní užívateľom definovanej funkcie kopírovania reťazcov: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
návrat 0;

strcpy () - optimalizovaná verzia definovaná používateľom (príklad6.c):

Teraz v tomto príklade programu optimalizujeme používateľom definovanú verziu strcpy ().

#include
char * strcpy_user_defined (char * dest, const char * src);
/ * Optimalizovaná verzia používateľom definovanej funkcie strcpy () * /
char * strcpy_user_defined (char * dest, const char * src)

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

int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Pred volaním používateľom definovanej funkcie kopírovania reťazcov: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
/ * Volanie používateľom definovanej funkcie kopírovania reťazcov * /
strcpy_user_defined (destination_str, source_str);
printf ("Po vykonaní užívateľom definovanej funkcie kopírovania reťazcov: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tReťazec cieľa =% s \ n \ n", cieľová_str.);
návrat 0;

Záver:

Funkcia strcpy () je veľmi populárna a praktická knižničná funkcia na vykonávanie operácie kopírovania reťazcov v programovacom jazyku C. Používa sa hlavne na kopírovanie reťazca z jedného miesta do druhého. Chceme však zopakovať skutočnosť, že funkcia strcpy () nevykonáva hraničnú kontrolu cieľového poľa, čo by v prípade ignorovania mohlo viesť k vážnej softvérovej chybe. Je vždy na zodpovednosti programátora, aby sa ubezpečil, že cieľové pole má dostatok priestoru na uloženie všetkých znakov zo zdrojového reťazca vrátane znaku NULL.

Hry Najlepšie aplikácie na mapovanie gamepadu pre Linux
Najlepšie aplikácie na mapovanie gamepadu pre Linux
Ak radi hráte hry v systéme Linux s gamepadom namiesto typického systému vstupu pre klávesnicu a myš, máte tu niekoľko užitočných aplikácií. Mnoho hie...
Hry Užitočné nástroje pre hráčov systému Linux
Užitočné nástroje pre hráčov systému Linux
Ak radi hráte hry v systéme Linux, je pravdepodobné, že ste na vylepšenie herného zážitku použili aplikácie a pomôcky ako Wine, Lutris a OBS Studio. O...
Hry HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
Mnoho vývojárov a vydavateľov hier prichádza s remastrom starých hier v rozlíšení HD, aby predĺžili životnosť franšízy. Prosím fanúšikov, ktorí požadu...