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

How Use Strcpy C Language



V tomto článku sa dozvieme o funkcii strcpy () v programovacom jazyku C. Funkcia strcpy () je veľmi populárnou funkciou štandardnej knižnice na vykonávanie operácie kopírovania reťazcov v programovacom jazyku C. Na vykonanie štandardných operácií existuje niekoľko štandardných hlavičkových súborov v programovacom jazyku C. Reťazec.h je jedným z takýchto hlavičkových súborov, ktoré poskytujú niekoľko štandardných funkcií knižnice na vykonávanie reťazcových operácií. Funkcia strcpy () je jednou z funkcií knižnice, ktorú poskytuje string.h.

Syntax:

char* strcpy (char*umiestnenie_cielu, konšt 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á akceptovať dva parametre -







  • char * destinácia
  • const char * zdroj

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. Akonáhle je operácia kopírovania dokončená zo zdroja do cieľa, funkcia strcpy () vráti adresu cieľa späť do funkcie volajúceho.



Tu je dôležité si uvedomiť, že funkcia strcpy () nepripojí zdrojový reťazec k cieľovému reťazcu. Obsah cieľa skôr nahradí obsahom zdrojového reťazca.



Tiež funkcia strcpy () nevykonáva žiadne kontroly, aby sa ubezpečil, že veľkosť cieľa je väčšia ako zdrojový reťazec, je za to úplne zodpovedný programátor.





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íklad programu ukazuje, ako vykonať normálnu operáciu kopírovania reťazcov pomocou funkcie strcpy () v programovacom jazyku C. Upozorňujeme, že dĺžka cieľového reťazca je 30 (char destination_str [30];), ktorá je väčšia ako dĺžka zdrojového reťazca (dĺžka je 18 vrátane znaku NULL), aby do cieľa bolo možné umiestniť všetky znaky z zdrojový reťazec.



#zahrnúť
#zahrnúť

intHlavná()
{
charsource_str[] = „www.linuxhint.com“;
chardestinácia_str[30];

printf („Pred zavolaním funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

strcpy (destinácia_str,source_str);

printf ('Po vykonaní funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

vrátiť sa 0;
}

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

Cieľom tohto príkladu programu je jasne vysvetliť, čo sa stane, ak 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 () nekontroluje, či je v cieli dostatok miesta.
  2. Vo vstavanom softvéri to môže byť nebezpečné, pretože strcpy () nahradí oblasť pamäte za hranicou cieľa.

Pozrime sa na ukážkový program. Deklarovali sme zdrojový_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, tj. Destinačný_str s veľkosťou iba 5. Cieľový_str. Teda nemôže obsahovať zdrojový reťazec s celkovou veľkosťou 18 bajtov.

Ale napriek tomu voláme funkciu strcpy () na skopírovanie zdrojového reťazca do cieľového reťazca. Z nižšie uvedeného výstupu vidíme, že strcpy () sa 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 v zdrojovom reťazci znak NULL) na cieľovú adresu (aj keď hranica cieľa prekračuje). To znamená, že funkcia strcpy () nevykonáva žiadnu hraničnú kontrolu cieľového poľa. Nakoniec funkcia strcpy () prepíše adresy pamäte, ktoré nie sú alokované do cieľového poľa. Preto funkcia strcpy () skončí s prepísaním pamäťových miest, ktoré môžu byť priradené k inej premennej.

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

#zahrnúť
#zahrnúť

intHlavná()
{
charsource_str[] = „www.linuxhint.com“;
chardestinácia_str[5];

printf („Pred zavolaním funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

strcpy (destinácia_str,source_str);

printf ('Po vykonaní funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

// printf ('Adresa zdroja = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('Cieľová adresa = %u (0x %x) n', & destination_str [0], & destination_str [0]);

vrátiť sa 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ípade sme inicializovali:

  • source_str do www.linuxhint.com [veľkosť = 17+1 = 18]
  • destination_str do 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í/nezmení však zostávajúce bajty (bajty 19 až 26, založené na jednom) v cieľovom poli. Na smyčku sme použili iteráciu cieľového poľa a vytlačenie celého poľa, aby sme dokázali, že bajty 19 až 26 sa v cieľovom poli nezmenili. Preto posledný výstup vidíme ako:

www.linuxhint.com_STRING .

#zahrnúť
#zahrnúť


/* Tento program ilustruje situáciu, keď:

veľkosť cieľového reťazca> veľkosť zdrojového reťazca

a spustí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.
* /

intHlavná()
{
charsource_str[] = „www.linuxhint.com“;
chardestinácia_str[26] = „I_AM_A_DESTINATION_STRING“;

printf („Pred zavolaním funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

strcpy (destinácia_str,source_str);

printf ('Po vykonaní funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);


/* vytlačiť cieľový reťazec pomocou cyklu for**/
printf ('Vytlačte cieľový reťazec char podľa char: n n');
printf (' tCieľový reťazec = ');

pre(inti=0;i<25;i++)
{
printf ('% c',destinácia_str[i]);
}
printf (' n n');

vrátiť sa 0;
}

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

Tento program sme považovali za príklad, ktorý ukazuje, že by sme nikdy nemali volať strcpy () s doslovným reťazcom ako cieľom. To spôsobí nedefinované správanie a nakoniec program zlyhá.

#zahrnúť
#zahrnúť

intHlavná()
{
charsource_str[] = „www.linuxhint.com“;

printf („Pred zavolaním funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);

/* Nikdy nevolajte strcpy () s doslovným reťazcom ako cieľom.
Program sa zrúti.
* /

strcpy ('destination_str',source_str);

printf ('Po vykonaní funkcie strcpy (): n n');
printf (' tReťazec zdroja = %s n',source_str);

vrátiť sa 0;
}

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

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

#zahrnúť
char *strcpy_user_defined(char *dest, konšt char *src);

/ * Užívateľom definovaná verzia funkcie strcpy () */
char *strcpy_user_defined(char *dest, konšt char *src)
{
char *dest_backup=dest;

kým(*src! = ' 0') /* Opakujte, kým sa nenájde ' 0'.*/
{
*dest= *src; / * Kopírovať zdrojový znak do cieľa */
src++; / * Zvýšiť ukazovateľ zdroja */
dest++; / * Zvýšiť ukazovateľ cieľa */
}

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

vrátiť sadest_backup;
}

intHlavná()
{
charsource_str[] = „www.linuxhint.com“;
chardestinácia_str[30];

printf („Pred zavolaním funkcie kopírovania reťazcov definovanej používateľom: n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

/ * Volá sa funkcia kopírovania reťazcov definovaná používateľom */
strcpy_user_defined(destinácia_str,source_str);

printf ('Po spustení funkcie kopírovania reťazcov definovanej používateľom: n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

vrátiť sa 0;
}

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

Teraz v tomto príklade programu budeme optimalizovať užívateľom definovanú verziu strcpy ().

#zahrnúť
char *strcpy_user_defined(char *dest, konšt char *src);


/ * Optimalizovaná verzia užívateľom definovanej funkcie strcpy () */
char *strcpy_user_defined(char *dest, konšt char *src)
{
char *dest_backup=dest;

kým(*dest++ = *src++)
;

vrátiť sadest_backup;
}

intHlavná()
{
charsource_str[] = „www.linuxhint.com“;
chardestinácia_str[30];

printf („Pred zavolaním funkcie kopírovania reťazcov definovanej používateľom: n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

/ * Volá sa funkcia kopírovania reťazcov definovaná používateľom */
strcpy_user_defined(destinácia_str,source_str);

printf ('Po spustení funkcie kopírovania reťazcov definovanej používateľom: n n');
printf (' tReťazec zdroja = %s n',source_str);
printf (' tCieľový reťazec = %s n n',destinácia_str);

vrátiť sa 0;
}

Záver :

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