C programavimas

Kaip naudoti Strcpy () C kalba?

Kaip naudoti Strcpy () C kalba?
Šiame straipsnyje mes sužinosime apie strcpy () funkciją C programavimo kalboje. Strcpy () funkcija yra labai populiari standartinė bibliotekos funkcija, atliekanti eilutės kopijavimo operaciją C programavimo kalba. Standartinėms operacijoms atlikti yra keletas standartinių antraštės failų C programavimo kalba. „Stygos.h “yra vienas iš tokių antraštės failų, suteikiantis keletą standartinių bibliotekos funkcijų eilutės operacijoms atlikti. „Strcpy ()“ funkcija yra viena iš „string“ teikiamų bibliotekos funkcijų.h “.

Sintaksė:

char * strcpy (char * paskirties_vieta, const char * šaltinio eilutė);

Suprasti strcpy ():

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

Šaltinis čia yra konstanta, siekiant užtikrinti, kad funkcija strcpy () negalėtų 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 į tikslą, funkcija strcpy () grąžins paskirties adresą skambinančiojo funkcijai.

Svarbus čia pastebimas dalykas yra tai, kad strcpy () funkcija neprideda šaltinio eilutės su paskirties eilute. Tai greičiau pakeičia paskirties turinį šaltinio eilutės turiniu.

Be to, funkcija strcpy () neatlieka jokių patikrinimų, kad paskirties vieta būtų didesnė nei šaltinio eilutė, už tai visiškai atsako programuotojas.

Pavyzdžiai:

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

  1. strcpy () - įprastas veikimas (1 pavyzdys.c)
  2. strcpy () - 1 byla (2 pavyzdys.c)
  3. strcpy () - 2 atvejis (3 pavyzdys.c)
  4. strcpy () - 3 atvejis (4 pavyzdys.c)
  5. strcpy () - vartotojo apibrėžta versija (5 pavyzdys.c)
  6. strcpy () - vartotojo optimizuota versija (6 pavyzdys).c)

strcpy () - įprastas veikimas (1 pavyzdys.c):

Šis programos pavyzdys parodo, kaip atlikti įprastą eilutės kopijavimo operaciją naudojant funkciją strcpy () C programavimo kalboje. Atkreipkite dėmesį, kad paskirties eilutės ilgis yra 30 (char destination_str [30];), kuris yra didesnis nei šaltinio eilutės ilgis (ilgis yra 18, įskaitant simbolį NULL), kad paskirties vieta galėtų sutalpinti visus simbolius iš šaltinio eilutė.

# įtraukti
# įtraukti
int main ()

char source_str [] = "www.linuxhint.com ";
char paskirties_str [30];
printf ("Prieš iškviečiant strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
strcpy (paskirties_str, šaltinio_str);
printf ("Įvykdžius strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
grąžinti 0;

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

Šios programos pavyzdžio tikslas yra aiškiai paaiškinti, kas nutinka, kai paskirties eilutės ilgis yra mažesnis nei šaltinio eilutės ilgis. Tokiais atvejais paskirties vietoje nebus pakankamai tarpų / baitų, kad tilptų visi simboliai (įskaitant NULL simbolį) iš šaltinio eilutės. Visada turėtumėte nepamiršti dviejų dalykų:

  1. Funkcija strcpy () netikrins, ar paskirties vietoje yra pakankamai vietos.
  2. Tai gali būti pavojinga įterptoje programinėje įrangoje, nes strcpy () pakeis atminties sritį už paskirties ribos.

Pažvelkime į pavyzdinę programą. Mes paskelbėme source_str ir inicializavome jį „www.linuxhint.com “, kurį išsaugoti reikės 18 baitų atmintyje, įskaitant simbolį„ Null “eilutės pabaigoje. Tada mes paskelbėme kitą simbolių masyvą, t.e. paskirties_str, kurio dydis tik 5. Taigi, paskirties_stras negali laikyti šaltinio eilutės, kurios bendras dydis yra 18 baitų.

Vis dėlto mes kviečiame funkciją strcpy (), kad nukopijuotume šaltinio eilutę į paskirties eilutę. Iš žemiau pateiktos išvesties galime pamatyti, kad strcpy () apskritai nesiskundė. Tokiu atveju funkcija strcpy () pradės kopijuoti simbolį iš šaltinio eilutės (kol šaltinio eilutėje ras simbolį NULL) į paskirties adresą (net jei paskirties riba viršija). Tai reiškia, kad funkcija strcpy () neatlieka paskirties masyvo ribų tikrinimo. Galų gale funkcija strcpy () perrašys atminties adresus, kurie nėra priskirti paskirties masyvui. Štai kodėl funkcija strcpy () galiausiai perrašys atminties vietas, kurios gali būti priskirtos kitam kintamajam.

Šiame pavyzdyje iš apačios matome, kad funkcija strcpy () perrašo patį šaltinio eilutę. Programuotojai visada turėtų būti atsargūs elgdamiesi su tokiu elgesiu.

# įtraukti
# įtraukti
int main ()

char source_str [] = "www.linuxhint.com ";
char paskirties_str [5];
printf ("Prieš iškviečiant strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
strcpy (paskirties_str, šaltinio_str);
printf ("Įvykdžius strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
// printf ("Šaltinio adresas =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Paskirties adresas =% u (0x% x) \ n", & paskirties_str [0], & paskirties_str [0]);
grąžinti 0;

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

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

  • source_str į „www.linuxhint.com “[dydis = 17 + 1 = 18]
  • paskirties_str į „I_AM_A_DESTINATION_STRING“ [dydis = 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 baito, vieno pagrindo) paskirties masyve. Mes naudojome ciklą, norėdami pakartoti paskirties masyvą ir atspausdinti visą masyvą, kad įrodytume, jog paskirties masyve batai nuo 19 iki 26 nepakito. Štai kodėl mes matome paskutinį rezultatą:

„Www.linuxhint.com_STRING “.

# įtraukti
# įtraukti
/ * Ši programa iliustruoja situaciją, kai:
paskirties eilutės dydis> šaltinio eilutės dydis
ir mes vykdome strcpy () funkciją, kad nukopijuotume
šaltinio eilutė į paskirties vietą.
Pastaba: paskirties eilutės dydis turėtų būti visada
būti didesnė arba lygi šaltinio eilutei.
* /
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Prieš iškviečiant strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
strcpy (paskirties_str, šaltinio_str);
printf ("Atlikus strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
/ * spausdinkite paskirties eilutę naudodami kilpą * /
printf ("Spausdinti paskirties eilutės char char char: \ n \ n");
printf ("\ tPaskirties eilutė =");
už (int i = 0; i<25;i++)

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

printf ("\ n \ n");
grąžinti 0;

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

Šią programą laikėme pavyzdžiu, parodančiu, kad niekada neturėtume paskambinti strcpy (), kurio eilutė yra tiesioginė, kaip paskirties vietą. Tai sukels neapibrėžtą elgesį ir galiausiai programa suges.

# įtraukti
# įtraukti
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Prieš iškviečiant strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
/ * Niekada nekvieskite strcpy (), kurio eilutė yra tiesioginė kaip paskirties vieta.
Programa suges.
* /
strcpy ("paskirties_str", šaltinio_str);
printf ("Atlikus strcpy () funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
grąžinti 0;

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

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

# įtraukti
char * strcpy_user_defined (char * dest, const char * src);
/ * Vartotojo apibrėžta strcpy () funkcijos versija * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = likimas;
o (* src != '\ 0') / * Kartoti tol, kol bus rasta '\ 0'.* /

* dest = * src; / * Kopijuoti šaltinio simbolį į paskirties vietą * /
src ++; / * Prieaugio šaltinio rodyklė * /
dest ++; / * Padidinti paskirties vietos rodyklę * /

* dest = '\ 0'; / * Aiškiai įterpkite „\ 0“ į paskirties vietą * /
grąžinti dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char paskirties_str [30];
printf ("Prieš skambinant vartotojo apibrėžtai eilutės kopijavimo funkcijai: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
/ * Skambinama vartotojo apibrėžta eilutės kopijavimo funkcija * /
strcpy_user_defined (paskirties_str, šaltinio_str);
printf ("Paleidus vartotojo apibrėžtą eilutės kopijavimo funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
grąžinti 0;

strcpy () - vartotojo optimizuota versija (6 pavyzdys).c):

Dabar šioje programos pavyzdyje mes ketiname optimizuoti vartotojo apibrėžtą strcpy () versiją.

# įtraukti
char * strcpy_user_defined (char * dest, const char * src);
/ * Optimizuota vartotojo apibrėžtos funkcijos strcpy () versija * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = likimas;
o (* dest ++ = * src ++)
;
grąžinti dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char paskirties_str [30];
printf ("Prieš skambinant vartotojo apibrėžtai eilutės kopijavimo funkcijai: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
/ * Skambinama vartotojo apibrėžta eilutės kopijavimo funkcija * /
strcpy_user_defined (paskirties_str, šaltinio_str);
printf ("Paleidus vartotojo apibrėžtą eilutės kopijavimo funkciją: \ n \ n");
printf ("\ tŠaltinio eilutė =% s \ n", šaltinio_str);
printf ("\ tPaskirties eilutė =% s \ n \ n", paskirties_str);
grąžinti 0;

Išvada:

Strcpy () funkcija yra labai populiari ir patogi bibliotekos funkcija, atliekanti eilutės kopijavimo operaciją C programavimo kalba. Tai daugiausia naudojama eilutei nukopijuoti iš vienos vietos į kitą. Tačiau mes norime pakartoti faktą, kad funkcija strcpy () neatlieka paskirties masyvo ribų tikrinimo, o tai ignoruodama gali sukelti rimtą programinės įrangos klaidą. Programuotojas visada yra atsakingas už tai, kad paskirties masyve būtų pakankamai vietos laikyti visus simbolius iš šaltinio eilutės, įskaitant simbolį NULL.

„OpenTTD“ ir „Simutrans“
Sukurti savo transporto modeliavimą gali būti smagu, atpalaiduojanti ir be galo viliojanti. Štai kodėl jūs turite įsitikinti, kad išbandėte kuo daugia...
„OpenTTD“ pamoka
„OpenTTD“ yra vienas iš populiariausių verslo modeliavimo žaidimų. Šiame žaidime turite sukurti nuostabų transporto verslą. Tačiau pradėsite nuo mažda...
„SuperTuxKart“, skirta „Linux“
„SuperTuxKart“ yra puikus pavadinimas, sukurtas nemokamai suteikti „Mario Kart“ patirtį jūsų „Linux“ sistemoje. Tai gana sudėtinga ir smagu žaisti, yr...