Paano gamitin ang Strcpy () sa wikang C?

How Use Strcpy C Language



Sa artikulong ito, matututunan natin ang tungkol sa pag-andar ng strcpy () sa wika ng C programa. Ang pag-andar ng strcpy () ay isang napakapopular na karaniwang pag-andar ng library upang maisagawa ang pagpapatakbo ng string copy sa wikang C programming. Maraming mga pamantayang mga file ng header sa wika ng C programa upang maisagawa ang karaniwang mga operasyon. Ang string.h ay isa sa mga naturang mga file ng header, na nagbibigay ng maraming karaniwang mga pagpapaandar sa library upang maisagawa ang mga pagpapatakbo ng string. Ang pag-andar ng strcpy () ay isa sa mga pagpapaandar sa library na ibinigay ng string.h.

Syntax:

char* strcpy (char*patutunguhan_location, Const char*source_string);

Pag-unawa sa strcpy ():

Ang nag-iisang layunin ng pag-andar ng strcpy () ay upang kopyahin ang isang string mula sa mapagkukunan patungo sa patutunguhan. Ngayon, hayaan nating tingnan ang nasa itaas na syntax ng pag-andar ng strcpy (). Ang pag-andar ng strcpy () ay may kakayahang tanggapin ang dalawang mga parameter -







  • patutunguhan ng char *
  • pinagmulan ng char char *

Ang pinagmulan ay isang pare-pareho dito upang matiyak na ang strcpy () na pagpapaandar ay hindi maaaring baguhin ang pinagmulan ng string. Ang function na strcpy () ay kumopya ng lahat ng mga character (kasama ang Null character sa dulo ng string) mula sa source string hanggang sa patutunguhan. Kapag kumpleto ang pagpapatakbo ng kopya mula sa mapagkukunan patungo sa patutunguhan, ibabalik ng function na strcpy () ang address ng patutunguhan pabalik sa pagpapaandar ng tumatawag.



Ang mahalagang puntong mapapansin dito ay, ang pag-andar ng strcpy () ay hindi idadagdag ang pinagmulang string gamit ang patutunguhang string. Sa halip ay pinalitan nito ang nilalaman ng patutunguhan ng nilalaman ng pinagmulan ng string.



Gayundin, ang pag-andar ng strcpy () ay hindi gumaganap ng anumang mga pagsusuri upang matiyak na ang laki ng patutunguhan ay higit pa sa pinagmulan ng string, ganap na responsibilidad ito ng programmer.





Mga halimbawa:

Ngayon, makakakita kami ng maraming mga halimbawa upang maunawaan ang pagpapaandar ng strcpy ():

  1. strcpy () - Karaniwang Operasyon (example1.c)
  2. strcpy () - Kaso-1 (halimbawa2.c)
  3. strcpy () - Kaso-2 (halimbawa3.c)
  4. strcpy () - Kaso-3 (halimbawa4.c)
  5. strcpy () - Bersyong Natukoy ng Gumagamit (halimbawa5.c)
  6. strcpy () - Na-optimize na Bersyon na Na-optimize ng Gumagamit (halimbawa6.c)

strcpy () - Karaniwang Operasyon (example1.c):

Ipinapakita ng halimbawang programa kung paano magsagawa ng isang normal na operasyon ng pagkopya ng string gamit ang function na strcpy () sa wika ng C programming. Mangyaring tandaan na ang haba ng patutunguhan string ay 30 (char patutunguhan_str [30];), na kung saan ay mas malaki kaysa sa haba ng pinagmulan string (haba ay 18 kasama ang character na NULL) upang ang patutunguhan ay maaaring tumanggap ng lahat ng mga character mula sa pinagmulan ng string.



# isama
# isama

intpangunahing()
{
charsource_str[] = 'www.linuxhint.com';
charpatutunguhan_str[30];

printf ('Bago tawagan ang strcpy () function: n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

strcpy (patutunguhan_str,source_str);

printf ('Pagkatapos maipatupad ang pagpapaandar ng strcpy (): n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

bumalik ka 0;
}

strcpy () - Kaso-1 (halimbawa2.c):

Ang hangarin ng halimbawang programa na ito ay upang malinaw na ipaliwanag kung ano ang nangyayari kapag ang haba ng patutunguhang string ay mas mababa kaysa sa haba ng pinagmulan ng string. Sa ganitong mga kaso, ang lokasyon ng patutunguhan ay hindi magkakaroon ng sapat na mga puwang / byte upang mapaunlakan ang lahat ng mga character (kabilang ang Null character) mula sa pinagmulang string. Dalawang bagay, dapat mong laging tandaan:

  1. Ang function ng strcpy () ay hindi susuriin kung ang patutunguhan ay may sapat na puwang.
  2. Maaaring mapanganib ito sa naka-embed na software dahil ang strcpy () ay papalitan ang lugar ng memorya na lampas sa hangganan ng patutunguhan.

Tingnan natin ang halimbawa ng programa. Idineklara namin ang source_str at pinasimulan ito sa www.linuxhint.com , na tatagal ng 18 bytes sa memorya upang maiimbak, kasama ang Null character sa dulo ng string. Pagkatapos, idineklara namin ang isa pang hanay ng character na ie

Ngunit, gayon pa man, tumatawag kami sa pagpapaandar ng strcpy () upang kopyahin ang pinagmulan ng string sa patutunguhang string. Mula sa output sa ibaba, makikita natin ang strcpy () na hindi nagreklamo. Sa kasong ito, magsisimula ang pag-andar ng strcpy () sa pagkopya ng character mula sa pinagmulang string (hanggang sa mahahanap nito ang character na NULL sa pinagmulang string) sa address ng patutunguhan (kahit na lumampas ang hangganan ng patutunguhan). Nangangahulugan iyon na ang pag-andar ng strcpy () ay hindi gumagawa ng anumang pag-check sa hangganan para sa array ng patutunguhan. Sa paglaon, ang pag-andar ng strcpy () ay mai-o-overlap ang mga address ng memorya na hindi inilalaan sa patutunguhang array. Ito ang dahilan kung bakit magtatapos ang pag-andar ng strcpy () sa pag-o-overtake sa mga lokasyon ng memorya na maaaring ilaan sa ibang variable.

Sa halimbawang ito, maaari nating makita mula sa output sa ibaba, na ang function na strcpy () ay pinapatungan ang pinagmulan ng string mismo. Dapat laging mag-ingat ang mga programmer sa gayong pag-uugali.

# isama
# isama

intpangunahing()
{
charsource_str[] = 'www.linuxhint.com';
charpatutunguhan_str[5];

printf ('Bago tawagan ang strcpy () function: n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

strcpy (patutunguhan_str,source_str);

printf ('Pagkatapos maipatupad ang pagpapaandar ng strcpy (): n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

// printf ('Source Address =% u (0x% x) n', & source_str [0], & source_str [0]);
// printf ('Destination Address =% u (0x% x) n', & patutunguhan_str [0], & patutunguhan_str [0]);

bumalik ka 0;
}

strcpy () - Kaso-2 (halimbawa3.c):

Inilalarawan ng program na ito ang sitwasyon kung ang laki ng patutunguhan ng string ay mas malaki kaysa sa laki ng pinagmulan ng string at ang string ng patutunguhan ay naisugod na may ilang halaga. Sa halimbawang ito, pinasimulan namin:

  • source_str sa www.linuxhint.com [laki = 17 + 1 = 18]
  • patutunguhan_str sa I_AM_A_DESTINATION_STRING [laki = 25 + 1 = 26]

Kopyahin ng pagpapaandar ng strcpy () ang lahat ng 17 mga character at ang character na NULL mula sa pinagmulang string hanggang sa patutunguhang string. Ngunit, hindi nito papalitan / babaguhin ang natitirang byte (Byte 19 hanggang 26, isa batay) sa patutunguhang array. Ginamit namin para sa loop upang umulit sa patutunguhang array at i-print ang buong array upang patunayan na ang bytes-19 hanggang 26 ay hindi nagbabago sa patutunguhang array. Iyon ang dahilan kung bakit nakikita namin ang huling output bilang:

www.linuxhint.com_STRING .

# isama
# isama


/ * Ang program na ito ay naglalarawan ng sitwasyon kung kailan:

laki ng patutunguhan ng string> laki ng pinagmulan ng string

at isinasagawa namin ang function na strcpy () upang kopyahin ang
source string patungo sa patutunguhan.

Tandaan: Dapat palaging ang laki ng patutunguhan ng string
maging mas malaki sa o katumbas ng pinagmulan ng string.
* /

intpangunahing()
{
charsource_str[] = 'www.linuxhint.com';
charpatutunguhan_str[26] = 'I_AM_A_DESTINATION_STRING';

printf ('Bago tawagan ang strcpy () function: n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

strcpy (patutunguhan_str,source_str);

printf ('Pagkatapos maipatupad ang pagpapaandar ng strcpy (): n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);


/ * i-print ang patutunguhang string gamit ang para sa loop * /
printf ('I-print ang patutunguhang string char ayon sa char: n n');
printf (' tDestination String = ');

para sa(intako=0;ako<25;ako++)
{
printf ('% c',patutunguhan_str[ako]);
}
printf (' n n');

bumalik ka 0;
}

strcpy () - Kaso-3 (halimbawa4.c):

Isinasaalang-alang namin ang program na ito bilang isang halimbawa upang maipakita na hindi namin dapat tawagan ang strcpy () na may isang literal na string bilang patutunguhan. Magdudulot ito ng hindi natukoy na pag-uugali at sa paglaon, mag-crash ang programa.

# isama
# isama

intpangunahing()
{
charsource_str[] = 'www.linuxhint.com';

printf ('Bago tawagan ang strcpy () function: n n');
printf (' tSource String =% s n',source_str);

/ * Huwag kailanman tumawag sa strcpy () na may literal na string bilang patutunguhan.
Mag-crash ang programa.
* /

strcpy ('patutunguhan_str',source_str);

printf ('Pagkatapos maipatupad ang pagpapaandar ng strcpy (): n n');
printf (' tSource String =% s n',source_str);

bumalik ka 0;
}

strcpy () - Bersyong Natukoy ng Gumagamit (halimbawa5.c):

Sa halimbawang programa na ito, ipinakita namin kung paano magsulat ng isang bersyon na tinukoy ng gumagamit na pag-andar ng strcpy ().

# isama
char *strcpy_user_defined(char *dest, Const char *src);

/ * Tinukoy ng gumagamit na bersyon ng strcpy () function * /
char *strcpy_user_defined(char *dest, Const char *src)
{
char *dest_backup=dest;

habang(*src! = ' 0') / * Iterate hanggang sa makita ang ' 0'. * /
{
*dest= *src; / * Kopyahin ang source char sa patutunguhan * /
src++; / * Pagdagdag ng mapagkukunan ng pointer * /
dest++; / * Pagdaragdag ng patutunguhang pointer * /
}

*dest= ' 0'; / * Ipasok ang ' 0' sa patutunguhan nang malinaw * /

bumalik kadest_backup;
}

intpangunahing()
{
charsource_str[] = 'www.linuxhint.com';
charpatutunguhan_str[30];

printf ('Bago tawagan ang function ng string copy na tinukoy ng gumagamit: n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

/ * Ang pagtawag sa tinukoy ng gumagamit na function ng string copy * /
strcpy_user_defined(patutunguhan_str,source_str);

printf ('Matapos maipatupad ang tinukoy ng gumagamit na function ng string copy: n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

bumalik ka 0;
}

strcpy () - Na-optimize na Bersyon na Na-optimize ng Gumagamit (halimbawa6.c):

Ngayon, sa halimbawang programa na ito, i-optimize namin ang bersyon na tinukoy ng gumagamit ng strcpy ().

# isama
char *strcpy_user_defined(char *dest, Const char *src);


/ * Na-optimize na bersyon ng tinukoy ng gumagamit na strcpy () function * /
char *strcpy_user_defined(char *dest, Const char *src)
{
char *dest_backup=dest;

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

bumalik kadest_backup;
}

intpangunahing()
{
charsource_str[] = 'www.linuxhint.com';
charpatutunguhan_str[30];

printf ('Bago tawagan ang function ng string copy na tinukoy ng gumagamit: n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

/ * Ang pagtawag sa tinukoy ng gumagamit na function ng string copy * /
strcpy_user_defined(patutunguhan_str,source_str);

printf ('Matapos maipatupad ang tinukoy ng gumagamit na function ng string copy: n n');
printf (' tSource String =% s n',source_str);
printf (' tDestination String =% s n n',patutunguhan_str);

bumalik ka 0;
}

Konklusyon :

Ang pag-andar ng strcpy () ay isang tanyag at madaling gamiting pag-andar ng library upang maisagawa ang pagpapatakbo ng string copy sa wikang C programming. Pangunahin itong ginagamit upang makopya ang string mula sa isang lokasyon patungo sa isa pang lokasyon. Gayunpaman, nais naming ulitin ang katotohanan na ang pag-andar ng strcpy () ay hindi ginagawa ang pagsusuri sa hangganan para sa patutunguhang array, na maaaring humantong sa isang seryosong software bug kung hindi pinansin. Palaging responsibilidad ng programmer na tiyakin na ang patutunguhang array ay may sapat na puwang upang hawakan ang lahat ng mga character mula sa pinagmulan ng string kasama ang character na NULL.