Kaip naudoti „Strcpy“ () C kalba?

How Use Strcpy C Language



Šiame straipsnyje mes sužinosime apie funkciją „strcpy ()“ C programavimo kalba. Funkcija strcpy () yra labai populiari standartinė bibliotekos funkcija, skirta atlikti eilutės kopijavimo operaciją C programavimo kalba. Standartinėms operacijoms atlikti yra keli standartiniai antraštės failai C programavimo kalba. Styga.h yra vienas iš tokių antraštės failų, kuriame yra keletas standartinių bibliotekos funkcijų, skirtų eilutės operacijoms atlikti. Funkcija strcpy () yra viena iš bibliotekos funkcijų, kurią teikia string.h.

Sintaksė:

anglis* strcpy (anglis*paskirties vieta, konst anglis*source_string);

„Strcpy“ () supratimas:

Vienintelis funkcijos strcpy () tikslas yra nukopijuoti eilutę iš šaltinio į paskirties vietą. Dabar pažvelkime į aukščiau pateiktą funkcijos strcpy () sintaksę. Funkcija strcpy () gali priimti du parametrus -





  • char * paskirties vieta
  • const char * šaltinis

Šaltinis yra pastovi, kad užtikrintų, jog funkcija strcpy () negali pakeisti šaltinio eilutės. Funkcija strcpy () nukopijuoja visus simbolius (įskaitant simbolį NULL eilutės pabaigoje) iš šaltinio eilutės į paskirties vietą. Kai kopijavimo operacija bus baigta iš šaltinio į paskirties vietą, funkcija strcpy () grąžins paskirties adresą atgal skambinančiojo funkcijai.



Svarbus dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad funkcija strcpy () neprideda šaltinio eilutės prie paskirties eilutės. Tai greičiau pakeičia paskirties turinį šaltinio eilutės turiniu.



Be to, funkcija „strcpy ()“ neatlieka jokių patikrinimų, siekdama užtikrinti, kad paskirties vietos dydis būtų didesnis nei šaltinio eilutė, už tai visiškai atsakingas programuotojas.





Pavyzdžiai:

Dabar pamatysime keletą pavyzdžių, kaip suprasti funkciją strcpy ():

  1. strcpy () - normalus veikimas (pavyzdys1.c)
  2. strcpy ()-1 atvejis (2.c pavyzdys)
  3. strcpy ()-2 atvejis (3.c pavyzdys)
  4. strcpy ()-3 atvejis (4.c pavyzdys)
  5. strcpy () - vartotojo apibrėžta versija (5.c pavyzdys)
  6. strcpy () - optimizuota vartotojo apibrėžta versija (pavyzdys6.c)

strcpy () - normalus veikimas (pavyzdys1.c):

Šioje pavyzdinėje programoje parodyta, kaip atlikti įprastą eilutės kopijavimo operaciją naudojant „C“ programavimo kalbos funkciją strcpy (). Atminkite, kad paskirties eilutės ilgis yra 30 (char paskirties_str [30];), kuri yra didesnė už šaltinio eilutės ilgį (ilgis yra 18, įskaitant simbolį NULL), kad paskirties vietoje būtų visi simboliai. šaltinio eilutė.



#įtraukti
#įtraukti

tarptpagrindinis()
{
anglissource_str[] = „www.linuxhint.com“;
anglistarget_str[30];

printf ('Prieš skambindami į funkciją strcpy (): n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

strcpy (target_str,source_str);

printf („Atlikus„ strcpy “() funkciją: n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

grįžti 0;
}

strcpy ()-1 atvejis (2.c pavyzdys):

Šios pavyzdinės programos tikslas yra aiškiai paaiškinti, kas atsitinka, kai paskirties eilutės ilgis yra mažesnis už šaltinio eilutės ilgį. Tokiais atvejais paskirties vietoje nebus pakankamai tarpų/baitų, kad tilptų visi simboliai (įskaitant simbolį NULL) iš šaltinio eilutės. Du dalykai, kuriuos visada turėtumėte turėti omenyje:

  1. Funkcija strcpy () nepatikrins, ar paskirties vietoje yra pakankamai vietos.
  2. Įterptinėje programinėje įrangoje tai gali būti pavojinga, nes „strcpy“ () pakeis atminties sritį už paskirties vietos ribos.

Pažvelkime į programos pavyzdį. Mes paskelbėme source_str ir inicijavome jį www.linuxhint.com , kuriam išsaugoti prireiks 18 baitų atmintyje, įskaitant simbolį „Null“ eilutės pabaigoje. Tada mes paskelbėme kitą simbolių masyvą, ty paskirties_str, kurio dydis yra tik 5. Taigi, paskirties_str negali turėti šaltinio eilutės, kurios bendras dydis yra 18 baitų.

Tačiau vis tiek kviečiame funkciją strcpy (), kad nukopijuotume šaltinio eilutę į paskirties eilutę. Iš žemiau pateiktos išvesties matome, kad strcpy () apskritai nesiskundė. Tokiu atveju funkcija strcpy () pradės kopijuoti simbolį iš šaltinio eilutės (kol šaltinio eilutėje neras simbolio NULL) į paskirties adresą (net jei paskirties riba viršija). Tai reiškia, kad funkcija strcpy () neatlieka paskirties masyvo ribų tikrinimo. Galiausiai funkcija „strcpy ()“ perrašys atminties adresus, kurie nėra priskirti paskirties masyvui. Štai kodėl funkcija strcpy () perrašys atminties vietas, kurios gali būti priskirtos kitam kintamajam.

Šiame pavyzdyje iš toliau pateiktos išvesties matome, kad funkcija strcpy () perrašo pačią šaltinio eilutę. Programuotojai visada turėtų būti atsargūs su tokiu elgesiu.

#įtraukti
#įtraukti

tarptpagrindinis()
{
anglissource_str[] = „www.linuxhint.com“;
anglistarget_str[5];

printf ('Prieš skambindami į funkciją strcpy (): n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

strcpy (target_str,source_str);

printf („Atlikus„ strcpy “() funkciją: n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

// printf ('Šaltinio adresas = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('Paskirties adresas = %u (0x %x) n', & paskirties_str [0] ir paskirties_str [0]);

grįžti 0;
}

strcpy ()-2 atvejis (3.c pavyzdys):

Ši programa iliustruoja situaciją, kai paskirties eilutės dydis yra didesnis nei šaltinio eilutės dydis, o paskirties eilutė jau yra inicijuota naudojant tam tikrą vertę. Šiame pavyzdyje mes inicijavome:

  • source_str to www.linuxhint.com [dydis = 17+1 = 18]
  • target_str to I_AM_A_DESTINATION_STRING [size = 25+1 = 26]

Funkcija strcpy () nukopijuos visus 17 simbolių ir NULL simbolį iš šaltinio eilutės į paskirties eilutę. Tačiau jis nepakeis/nepakeis likusių baitų (nuo 19 iki 26 baitų, vienas iš jų) paskirties masyve. Mes naudojome ciklą, norėdami pakartoti paskirties masyvą ir išspausdinti visą masyvą, kad įrodytume, jog baitai nuo 19 iki 26 nepasikeitė paskirties masyve. Štai kodėl paskutinį rezultatą matome taip:

www.linuxhint.com_STRING .

#įtraukti
#įtraukti


/* Ši programa iliustruoja situaciją, kai:

paskirties eilutės dydis> šaltinio eilutės dydis

ir mes vykdome funkciją strcpy (), kad nukopijuotume
šaltinio eilutę į paskirties vietą.

Pastaba: paskirties eilutės dydis visada turėtų būti
būti didesnis arba lygus šaltinio eilutei.
* /

tarptpagrindinis()
{
anglissource_str[] = „www.linuxhint.com“;
anglistarget_str[26] = „I_AM_A_DESTINATION_STRING“;

printf ('Prieš skambindami į funkciją strcpy (): n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

strcpy (target_str,source_str);

printf („Atlikus„ strcpy “() funkciją: n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);


/* spausdinti paskirties eilutę naudojant kilpą*/
printf („Atspausdinkite paskirties eilutės simbolį char: n n');
printf (' tPaskirties eilutė = ');

dėl(tarpti=0;i<25;i++)
{
printf ('% c',target_str[i]);
}
printf (' n n');

grįžti 0;
}

strcpy ()-3 atvejis (4.c pavyzdys):

Mes laikėme šią programą pavyzdžiu, norėdami parodyti, kad niekada neturėtume vadinti strcpy (), kurio paskirties vieta yra tiesioginė eilutė. Tai sukels neapibrėžtą elgesį ir galiausiai programa suges.

#įtraukti
#įtraukti

tarptpagrindinis()
{
anglissource_str[] = „www.linuxhint.com“;

printf ('Prieš skambindami į funkciją strcpy (): n n');
printf (' tŠaltinio eilutė = %s n',source_str);

/* Niekada neskambinkite strcpy (), o paskirties vieta - literal.
Programa suges.
* /

strcpy ('destination_str',source_str);

printf („Atlikus„ strcpy “() funkciją: n n');
printf (' tŠaltinio eilutė = %s n',source_str);

grįžti 0;
}

strcpy () - vartotojo apibrėžta versija (5.c pavyzdys):

Šioje programos pavyzdyje mes parodėme, kaip parašyti vartotojo apibrėžtą funkcijos strcpy () versiją.

#įtraukti
anglis *strcpy_user_defined(anglis *dest, konst anglis *src);

/ * Vartotojo apibrėžta „strcpy ()“ funkcijos versija */
anglis *strcpy_user_defined(anglis *dest, konst anglis *src)
{
anglis *dest_backup=dest;

tuo tarpu(*src! = ' 0') /* Kartokite, kol bus rastas „ 0“.*/
{
*dest= *src; / * Kopijuoti šaltinio ženklą į paskirties vietą */
src++; / * Padidinimo šaltinio žymeklis */
dest++; / * Padidinti paskirties žymeklį */
}

*dest= ' 0'; /* Į paskirties vietą aiškiai įterpkite „ 0“*/

grįžtidest_backup;
}

tarptpagrindinis()
{
anglissource_str[] = „www.linuxhint.com“;
anglistarget_str[30];

printf („Prieš skambindami vartotojo apibrėžta eilutės kopijavimo funkcija: n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

/ * Skambinama vartotojo apibrėžta eilutės kopijavimo funkcija */
strcpy_user_defined(target_str,source_str);

printf („Atlikus vartotojo apibrėžtą eilutės kopijavimo funkciją: n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

grįžti 0;
}

strcpy () - optimizuota vartotojo apibrėžta versija (pavyzdys6.c):

Dabar šioje programos pavyzdyje mes optimizuosime vartotojo apibrėžtą „strcpy ()“ versiją.

#įtraukti
anglis *strcpy_user_defined(anglis *dest, konst anglis *src);


/ * Optimizuota vartotojo apibrėžtos funkcijos „strcpy ()“ versija */
anglis *strcpy_user_defined(anglis *dest, konst anglis *src)
{
anglis *dest_backup=dest;

tuo tarpu(*dest++ = *src++)
;

grįžtidest_backup;
}

tarptpagrindinis()
{
anglissource_str[] = „www.linuxhint.com“;
anglistarget_str[30];

printf („Prieš skambindami vartotojo apibrėžta eilutės kopijavimo funkcija: n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

/ * Skambinama vartotojo apibrėžta eilutės kopijavimo funkcija */
strcpy_user_defined(target_str,source_str);

printf („Atlikus vartotojo apibrėžtą eilutės kopijavimo funkciją: n n');
printf (' tŠaltinio eilutė = %s n',source_str);
printf (' tPaskirties eilutė = %s n n',target_str);

grįžti 0;
}

Išvada :

Funkcija strcpy () yra labai populiari ir patogi bibliotekos funkcija, skirta atlikti eilutės kopijavimo operaciją C programavimo kalba. Tai daugiausia naudojama norint nukopijuoti eilutę iš vienos vietos į kitą. Tačiau norime pakartoti faktą, kad funkcija strcpy () neatlieka paskirties masyvo ribų tikrinimo, o tai gali būti rimta programinės įrangos klaida, jei jos nepaisoma. Programuotojas visada yra atsakingas už tai, kad paskirties masyvas turėtų pakankamai vietos visiems šaltinio eilutės simboliams, įskaitant NULL simbolį.