C Programmeerimine

Strcpy () kasutamine C-keeles?

Strcpy () kasutamine C-keeles?
Selles artiklis tutvume funktsiooniga strcpy () programmeerimiskeeles C. Funktsioon strcpy () on väga populaarne raamatukogu funktsioon, mis täidab stringide kopeerimist C-programmeerimiskeeles. Standardsete toimingute tegemiseks on C-programmeerimiskeeles mitu standardset päisefaili. „String.h ”on üks sellistest päisefailidest, mis pakub stringite toimingute tegemiseks mitmeid raamatukogu standardfunktsioone. Funktsioon “strcpy ()” on üks teegi funktsioonidest, mille pakub string.h ”.

Süntaks:

char * strcpy (char * sihtkoha_koht, const char * allika_string);

Strcpy () mõistmine:

Funktsiooni strcpy () ainus eesmärk on stringi kopeerimine allikast sihtkohta. Nüüd vaatame ülaltoodud funktsiooni strcpy () süntaksit. Funktsioon strcpy () on võimeline aktsepteerima kahte parameetrit -

Allikas on siin konstant, tagamaks, et funktsioon strcpy () ei saa muuta allika stringi. Funktsioon strcpy () kopeerib kõik märgid (kaasa arvatud stringi lõpus olev märk NULL) lähtestringist sihtkohta. Kui allikast sihtkohta kopeerimine on lõpule viidud, tagastab funktsioon strcpy () sihtkoha aadressi tagasi helistaja funktsioonile.

Oluline punkt, mida siin tähele panna, on see, et funktsioon strcpy () ei lisa lähte stringi sihtstringiga. Pigem asendab see sihtkoha sisu lähtestringi sisuga.

Samuti ei tee funktsioon strcpy () ühtegi kontrolli selle tagamiseks, et sihtkoha suurus oleks suurem kui algstring, see on täielikult programmeerija vastutusel.

Näited:

Nüüd näeme funktsiooni strcpy () mõistmiseks mitmeid näiteid:

  1. strcpy () - tavaline töö (näide1.c)
  2. strcpy () - juhtum-1 (näide2.c)
  3. strcpy () - juhtum-2 (näide3.c)
  4. strcpy () - juhtum 3 (näide4.c)
  5. strcpy () - kasutaja määratud versioon (näide5.c)
  6. strcpy () - Kasutaja määratud versioon on optimeeritud (näide6.c)

strcpy () - tavaline töö (näide1.c):

See näidisprogramm näitab, kuidas teha tavalist stringi kopeerimistoimingut, kasutades funktsiooni strcpy () C-programmeerimiskeeles. Pange tähele, et sihtkoha stringi pikkus on 30 (char destination_str [30];), mis on suurem kui lähtestringi pikkus (pikkus on 18 koos tähemärgiga NULL), et sihtkoht mahutaks kõik tähemärgid allika string.

# kaasata
# kaasata
int main ()

char source_str [] = "www.linuxhint.com ";
char sihtkoht_str [30];
printf ("Enne funktsiooni strcpy () kutsumist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
strcpy (sihtkoha_str, allika_str);
printf ("Pärast funktsiooni strcpy () käivitamist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
tagastama 0;

strcpy () - juhtum-1 (näide2.c):

Selle näidisprogrammi eesmärk on selgitada selgelt, mis juhtub, kui sihtkoha stringi pikkus on väiksem kui lähte stringi pikkus. Sellistel juhtudel ei ole sihtkoha asukohas piisavalt tühikuid / baite, et mahutada kõiki tähemärke (sh NULL-tähemärki) lähtestringist. Peaksite alati meeles pidama kahte asja:

  1. Funktsioon strcpy () ei kontrolli, kas sihtkohas on piisavalt ruumi.
  2. See võib olla varjatud tarkvaras ohtlik, kuna strcpy () asendab mälupiirkonna väljaspool sihtkoha piiri.

Vaatame näidisprogrammi. Oleme deklareerinud source_str ja initsialiseerinud selle saidile „www.linuxhint.com ”, mille salvestamiseks kulub 18 baiti, sealhulgas stringi lõpus olev märk Null. Siis oleme kuulutanud teise tähemassiivi i.e. sihtkoha_str suurusega ainult 5. Niisiis ei saa destination_str hoida lähtekoodistringi, mille kogumaht on 18 baiti.

Kuid ikkagi kutsume lähtestringi sihtstringi kopeerimiseks funktsiooni strcpy (). Allpool olevast väljundist näeme, et strcpy () ei kaebanud üldse. Sellisel juhul hakkab funktsioon strcpy () kopeerima märki lähtestringist (kuni see leiab allikast stringis NULL) sihtkoha aadressile (kuigi sihtkoha piir ületab). See tähendab, et funktsioon strcpy () ei tee sihtmassiivi piirikontrolli. Lõpuks kirjutab funktsioon strcpy () üle mäluaadressid, mis pole sihtmassiivile eraldatud. Sellepärast kirjutab funktsioon strcpy () lõpuks üle mälukohad, mis võidakse omistada teisele muutujale.

Selles näites näeme allpool olevast väljundist, et funktsioon strcpy () kirjutab allika stringi ise üle. Programmeerijad peaksid sellise käitumisega alati ettevaatlikud olema.

# kaasata
# kaasata
int main ()

char source_str [] = "www.linuxhint.com ";
char sihtkoht_str [5];
printf ("Enne funktsiooni strcpy () kutsumist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
strcpy (sihtkoha_str, allika_str);
printf ("Pärast funktsiooni strcpy () käivitamist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
// printf ("Allika aadress =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Sihtkoha aadress =% u (0x% x) \ n", & sihtkoha_str [0] ja sihtkoha_str [0]);
tagastama 0;

strcpy () - juhtum-2 (näide3.c):

See programm illustreerib olukorda, kui sihtkoha stringi suurus on suurem kui lähte stringi suurus ja sihtkoha string on juba mõne väärtusega initsialiseeritud. Selles näites oleme lähtestanud:

  • source_str to “www.linuxhint.com ”[suurus = 17 + 1 = 18]
  • sihtkoha_str kuni "I_AM_A_DESTINATION_STRING" [suurus = 25 + 1 = 26]

Funktsioon strcpy () kopeerib kõik 17 tähemärki ja NULL-tähemärgi lähtestringist sihtstringi. Kuid see ei asenda / muuda sihtmassiivi ülejäänud baite (bait 19–26, üks põhine). Oleme kasutanud tsüklit sihtkoha massiivi kordamiseks ja kogu massiivi printimiseks, et tõestada, et baidid-19 kuni 26 on sihtmassiivis muutmata. Seetõttu näeme viimast väljundit järgmiselt:

„Www.linuxhint.com_STRING ”.

# kaasata
# kaasata
/ * See programm illustreerib olukorda, kui:
sihtkoha stringi suurus> allika stringi suurus
ja käivitame funktsiooni strcpy () faili kopeerimiseks
allika string sihtkohta.
Märkus. Sihtstringi suurus peaks alati olema
olema suurem või võrdne allikastringiga.
* /
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Enne funktsiooni strcpy () kutsumist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
strcpy (sihtkoha_str, allika_str);
printf ("Pärast funktsiooni strcpy () käivitamist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
/ * printige sihtkoha string silmuseks * /
printf ("Sihtstringi char printimine char-ga: \ n \ n");
printf ("\ tSihtkoha string =");
jaoks (int i = 0; i<25;i++)

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

printf ("\ n \ n");
tagastama 0;

strcpy () - juhtum 3 (näide4.c):

Oleme pidanud seda programmi näitena, et me ei tohiks kunagi kutsuda strcpy (), mille sihtkohaks on string string. See põhjustab määratlemata käitumist ja lõpuks jookseb programm kokku.

# kaasata
# kaasata
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Enne funktsiooni strcpy () kutsumist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
/ * Ärge kunagi nimetage strcpy (), mille sihtkoht on string.
Programm jookseb kokku.
* /
strcpy ("sihtkoha_str", allika_str);
printf ("Pärast funktsiooni strcpy () käivitamist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
tagastama 0;

strcpy () - kasutaja määratud versioon (näide5.c):

Selles näidisprogrammis oleme näidanud, kuidas kirjutada funktsiooni strcpy () kasutaja määratud versioon.

# kaasata
char * strcpy_user_defined (char * dest, const char * src);
/ * Funktsiooni strcpy () kasutaja määratud versioon * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
samas (* src != '\ 0') / * korduvad, kuni '\ 0' on leitud.* /

* dest = * src; / * Kopeeri allika märk sihtkohta * /
src ++; / * Suurendav allikakursor * /
dest ++; / * Sihtkoha kursori suurendamine * /

* dest = '\ 0'; / * Sisestage sihtkohta sõnaselgelt '\ 0' * /
tagastama dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char sihtkoht_str [30];
printf ("Enne kasutaja määratud stringi kopeerimisfunktsiooni kutsumist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
/ * Kasutaja määratud stringi kopeerimisfunktsiooni kutsumine * /
strcpy_user_defined (sihtkoha_str, allika_str);
printf ("Pärast kasutaja määratud stringi kopeerimisfunktsiooni käivitamist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
tagastama 0;

strcpy () - Kasutaja määratud versioon on optimeeritud (näide6.c):

Selles näidisprogrammis optimeerime strcpy () kasutaja määratud versiooni.

# kaasata
char * strcpy_user_defined (char * dest, const char * src);
/ * Funktsiooni strcpy () optimeeritud versioon * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
samas (* dest ++ = * src ++)
;
tagastama dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char sihtkoht_str [30];
printf ("Enne kasutaja määratud stringi kopeerimisfunktsiooni kutsumist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
/ * Kasutaja määratud stringi kopeerimisfunktsiooni kutsumine * /
strcpy_user_defined (sihtkoha_str, allika_str);
printf ("Pärast kasutaja määratud stringi kopeerimisfunktsiooni käivitamist: \ n \ n");
printf ("\ tSource'i string =% s \ n", source_str);
printf ("\ tSihtstring =% s \ n \ n", sihtkoha_str);
tagastama 0;

Järeldus:

Funktsioon strcpy () on väga populaarne ja mugav raamatukogu funktsioon stringide kopeerimise toimingu tegemiseks programmeerimiskeeles C. Seda kasutatakse peamiselt stringi kopeerimiseks ühest kohast teise. Siiski tahame korrata tõsiasja, et funktsioon strcpy () ei tee sihtmassiivi piirikontrolli, mis võib ignoreerimisel põhjustada tõsise tarkvaravea. Programmeerija vastutab alati selle eest, et sihtmassiivil oleks piisavalt ruumi, et hoida kõiki allika stringi tähemärke, kaasa arvatud märk NULL.

HD Remastered Games Linuxile, millel pole kunagi varem Linuxi väljalaset olnud
Paljud mängude arendajad ja kirjastajad pakuvad frantsiisi eluea pikendamiseks välja vanade mängude HD-remasteri. Palun fännid, kes soovivad ühilduvus...
Kuidas kasutada AutoKeyt Linuxi mängude automatiseerimiseks
AutoKey on Linuxi ja X11 töölaua automatiseerimise utiliit, mis on programmeeritud Python 3, GTK ja Qt. Selle skriptimise ja MACRO funktsionaalsuse ab...
Kuidas näidata FPS-loendurit Linuxi mängudes
Linuxi mängimine sai suure tõuke, kui Valve teatas Steam-kliendi ja nende mängude Linuxi toest 2012. aastal. Sellest ajast peale on paljud AAA- ja ind...