Kuidas kasutada Strcpy () C -keeles?

How Use Strcpy C Language



Selles artiklis tutvume C -programmeerimiskeele funktsiooniga strcpy (). Funktsioon strcpy () on väga populaarne standardne raamatukogu funktsioon stringide kopeerimiseks C -programmeerimiskeeles. Standardtoimingute tegemiseks on C programmeerimiskeeles mitu standardset päisefaili. String.h on üks sellistest päisefailidest, mis pakub stringi toimingute tegemiseks mitmeid standardseid raamatukogu funktsioone. Funktsioon strcpy () on üks teegi funktsioonidest, mida pakub string.h.

Süntaks:

süsi* strcpy (süsi*sihtkoha_koht, const süsi*allika_string);

Strcpy () mõistmine:

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





  • char * sihtkoht
  • const char * allikas

Allikas on siin konstant, et tagada, et funktsioon strcpy () ei saaks lähtestringi muuta. Funktsioon strcpy () kopeerib kõik märgid (sealhulgas NULL -märgi stringi lõpus) ​​lähtestringist sihtkohta. Kui kopeerimine on allikast sihtkohta lõpule viidud, tagastab funktsioon strcpy () sihtkoha aadressi helistajafunktsioonile.



Siinkohal on oluline tähele panna, et funktsioon strcpy () ei lisa lähtestringi sihtstringiga. Pigem asendab see sihtkoha sisu lähtestringi sisuga.



Funktsioon strcpy () ei teosta ka kontrolle, et sihtkoha suurus oleks suurem kui lähtestring, see on täielikult programmeerija kohustus.





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 optimeeritud (näide6.c)

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

See näidisprogramm näitab, kuidas teha tavalist stringi kopeerimist, kasutades C -programmeerimiskeele funktsiooni strcpy (). Pange tähele, et sihtstringi pikkus on 30 (char target_str [30];), mis on suurem kui allika stringi pikkus (pikkus on 18, sealhulgas NULL -märk), nii et sihtkoht mahutab kõik allika string.



#kaasake
#kaasake

intpeamine()
{
süsisource_str[] = 'www.linuxhint.com';
süsisihtkoha_str[30];

printf ('Enne funktsiooni strcpy () helistamist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

strcpy (sihtkoha_str,source_str);

printf ('Pärast funktsiooni strcpy () täitmist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

tagasi 0;
}

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

Selle näidisprogrammi eesmärk on selgelt selgitada, mis juhtub siis, kui sihtstringi pikkus on lühem kui lähtestringi pikkus. Sellistel juhtudel ei ole sihtkohas piisavalt tühikuid/baite, et mahutada kõik allikastringi märgid (sh NULL -märk). Kaks asja, mida peaksite alati meeles pidama:

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

Vaatame näidisprogrammi. Oleme deklareerinud source_str ja lähtestanud selle www.linuxhint.com , mille salvestamiseks kulub mälus 18 baiti, sealhulgas nullmärk stringi lõpus. Seejärel oleme deklareerinud teise märgi massiivi, st sihtkoha_str, mille suurus on vaid 5. Seega ei saa sihtkohastrukt hoida allstringi kogumahuga 18 baiti.

Kuid ikkagi kutsume funktsiooni strcpy (), et kopeerida lähtestring sihtstringi. Alltoodud väljundist näeme, et strcpy () ei kurtnud üldse. Sel juhul hakkab funktsioon strcpy () kopeerima märgi lähtestringist (kuni see leiab allika stringist NULL märgi) sihtkoha aadressile (kuigi sihtkoha piir ületab). See tähendab, et funktsioon strcpy () ei tee sihtmassiivi jaoks piirikontrolli. Lõpuks kirjutab funktsioon strcpy () üle mäluaadressid, mis pole sihtmassiivile eraldatud. Sellepärast kirjutab funktsioon strcpy () üle mälukohad, mis võidakse eraldada teisele muutujale.

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

#kaasake
#kaasake

intpeamine()
{
süsisource_str[] = 'www.linuxhint.com';
süsisihtkoha_str[5];

printf ('Enne funktsiooni strcpy () helistamist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

strcpy (sihtkoha_str,source_str);

printf ('Pärast funktsiooni strcpy () täitmist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

// printf ('Lähteaadress = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('Sihtkoha aadress = %u (0x %x) n', & sihtkoha_str [0] ja sihtkoha_str [0]);

tagasi 0;
}

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

See programm illustreerib olukorda, kui sihtstringi suurus on suurem kui lähtestringi suurus ja sihtstring on juba mõne väärtusega lähtestatud. Selles näites oleme lähtestanud:

  • source_str kuni www.linuxhint.com [suurus = 17+1 = 18]
  • sihtkoha_str sihtkohta I_AM_A_DESTINATION_STRING [suurus = 25+1 = 26]

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

www.linuxhint.com_STRING .

#kaasake
#kaasake


/* See programm illustreerib olukorda, kui:

sihtstringi suurus> lähtestringi suurus

ja me kopeerime funktsiooni strcpy ()
allika string sihtkohta.

Märkus. Sihtstringi suurus peaks alati olema
olla suurem või võrdne lähtestringiga.
* /

intpeamine()
{
süsisource_str[] = 'www.linuxhint.com';
süsisihtkoha_str[26] = „I_AM_A_DESTINATION_STRING”;

printf ('Enne funktsiooni strcpy () helistamist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

strcpy (sihtkoha_str,source_str);

printf ('Pärast funktsiooni strcpy () täitmist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);


/* prindi sihtstring, kasutades tsüklit*/
printf ('Printige sihtmärgi sümbol char järgi: n n');
printf (' tSihtstring = ');

eest(inti=0;i<25;i++)
{
printf ('% c',sihtkoha_str[i]);
}
printf (' n n');

tagasi 0;
}

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

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

#kaasake
#kaasake

intpeamine()
{
süsisource_str[] = 'www.linuxhint.com';

printf ('Enne funktsiooni strcpy () helistamist: n n');
printf (' tAllika string = %s n',source_str);

/* Ärge kunagi helistage sihtkohta strcpy (), mille string on literaalne.
Programm jookseb kokku.
* /

strcpy ('target_str',source_str);

printf ('Pärast funktsiooni strcpy () täitmist: n n');
printf (' tAllika string = %s n',source_str);

tagasi 0;
}

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

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

#kaasake
süsi *strcpy_user_defined(süsi *dest, const süsi *src);

/ * Funktsiooni strcpy () kasutaja määratud versioon */
süsi *strcpy_user_defined(süsi *dest, const süsi *src)
{
süsi *dest_backup=dest;

samas(*src! = ' 0') /* Korda, kuni leitakse ' 0'.*/
{
*dest= *src; / * Kopeeri lähtemärk sihtkohta */
src++; / * Allika kursori suurendamine */
dest++; / * Sihtkursori suurendamine */
}

*dest= ' 0'; /* Sisestage sihtkohta selgesõnaliselt ' 0'*/

tagasidest_backup;
}

intpeamine()
{
süsisource_str[] = 'www.linuxhint.com';
süsisihtkoha_str[30];

printf ('Enne kasutaja määratud stringide kopeerimisfunktsiooni helistamist tehke järgmist. n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

/ * Kasutaja määratud stringide kopeerimisfunktsiooni kutsumine */
strcpy_user_defined(sihtkoha_str,source_str);

printf ('Pärast kasutaja määratud stringi kopeerimisfunktsiooni käivitamist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

tagasi 0;
}

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

Nüüd, selles näidisprogrammis, optimeerime kasutaja määratud versiooni strcpy ().

#kaasake
süsi *strcpy_user_defined(süsi *dest, const süsi *src);


/ * Kasutaja määratud funktsiooni strcpy () optimeeritud versioon */
süsi *strcpy_user_defined(süsi *dest, const süsi *src)
{
süsi *dest_backup=dest;

samas(*dest++ = *src++)
;

tagasidest_backup;
}

intpeamine()
{
süsisource_str[] = 'www.linuxhint.com';
süsisihtkoha_str[30];

printf ('Enne kasutaja määratud stringide kopeerimisfunktsiooni helistamist tehke järgmist. n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

/ * Kasutaja määratud stringide kopeerimisfunktsiooni kutsumine */
strcpy_user_defined(sihtkoha_str,source_str);

printf ('Pärast kasutaja määratud stringi kopeerimisfunktsiooni käivitamist: n n');
printf (' tAllika string = %s n',source_str);
printf (' tSihtstring = %s n n',sihtkoha_str);

tagasi 0;
}

Järeldus :

Funktsioon strcpy () on väga populaarne ja mugav raamatukogu funktsioon stringide kopeerimiseks C -programmeerimiskeeles. Seda kasutatakse peamiselt stringi kopeerimiseks ühest asukohast teise. Siiski tahame korrata asjaolu, et funktsioon strcpy () ei tee sihtmassiivi piirikontrolli, mis võib ignoreerimisel põhjustada tõsise tarkvaravea. Programmeerija vastutab alati selle eest, et sihtmassiivis oleks piisavalt ruumi, et hoida allikastringi kõiki märke, sealhulgas NULL -märki.