Kā lietot Strcpy () C valodā?

How Use Strcpy C Language



Šajā rakstā mēs uzzināsim par funkciju strcpy () C programmēšanas valodā. Funkcija strcpy () ir ļoti populāra standarta bibliotēkas funkcija, lai veiktu virkņu kopēšanas darbību C programmēšanas valodā. Standarta darbību veikšanai ir vairāki standarta galvenes faili C programmēšanas valodā. String.h ir viens no šādiem galvenes failiem, kas nodrošina vairākas standarta bibliotēkas funkcijas, lai veiktu virkņu darbības. Funkcija strcpy () ir viena no bibliotēkas funkcijām, ko nodrošina string.h.

Sintakse:

char* strcpy (char*galamērķa_atrašanās vieta, konst char*source_string);

Izpratne par strcpy ():

Funkcijas strcpy () vienīgais mērķis ir kopēt virkni no avota uz galamērķi. Tagad apskatīsim iepriekš minēto funkcijas strcpy () sintaksi. Funkcija strcpy () spēj pieņemt divus parametrus -







  • char * galamērķis
  • const char * avots

Avots šeit ir nemainīgs, lai nodrošinātu, ka funkcija strcpy () nevar mainīt avota virkni. Funkcija strcpy () kopē visas rakstzīmes (ieskaitot rakstzīmi NULL virknes beigās) no avota virknes uz galamērķi. Kad kopēšanas darbība ir pabeigta no avota līdz galamērķim, funkcija strcpy () atgriež galamērķa adresi zvanītāja funkcijai.



Šeit ir svarīgi atzīmēt, ka funkcija strcpy () nepievieno avota virkni ar mērķa virkni. Tas drīzāk aizstāj galamērķa saturu ar avota virknes saturu.



Arī funkcija strcpy () neveic nekādas pārbaudes, lai nodrošinātu, ka galamērķa lielums ir lielāks par avota virkni, tas ir pilnībā programmētāja pienākums.





Piemēri:

Tagad mēs redzēsim vairākus piemērus, lai saprastu funkciju strcpy ():

  1. strcpy () - normāla darbība (1.c piemērs)
  2. strcpy ()-1. gadījums (2.c piemērs)
  3. strcpy ()-2. gadījums (3.c piemērs)
  4. strcpy ()-3. gadījums (4.c piemērs)
  5. strcpy () - lietotāja definēta versija (piemērs5.c)
  6. strcpy () - lietotāja definēta versija optimizēta (piemērs6.c)

strcpy () - normāla darbība (1.c piemērs):

Šajā programmas paraugā ir parādīts, kā veikt parastu virkņu kopēšanas darbību, izmantojot C programmēšanas valodas funkciju strcpy (). Lūdzu, ņemiet vērā, ka galamērķa virknes garums ir 30 (char target_str [30];), kas ir lielāks par avota virknes garumu (garums ir 18, ieskaitot NULL rakstzīmi), lai galamērķis varētu uzņemt visas rakstzīmes no avota virkne.



#iekļaut
#iekļaut

intgalvenais()
{
charsource_str[] = 'www.linuxhint.com';
chargalamērķa_str[30];

printf ('Pirms izsaukt funkciju strcpy (): n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

strcpy (galamērķa_str,source_str);

printf ('Pēc funkcijas strcpy () izpildes: n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

atgriezties 0;
}

strcpy ()-1. gadījums (2.c piemērs):

Šīs programmas piemēra mērķis ir skaidri izskaidrot, kas notiek, ja galamērķa virknes garums ir mazāks par avota virknes garumu. Šādos gadījumos galamērķa vietā nebūs pietiekami daudz atstarpju/baitu, lai ietilpinātu visas rakstzīmes (ieskaitot rakstzīmi NULL) no avota virknes. Divas lietas, kas jums vienmēr jāpatur prātā:

  1. Funkcija strcpy () nepārbaudīs, vai galamērķī ir pietiekami daudz vietas.
  2. Iebūvētajā programmatūrā tas var būt bīstami, jo strcpy () aizstās atmiņas zonu ārpus galamērķa robežas.

Apskatīsim programmas piemēru. Mēs esam deklarējuši source_str un inicializējuši to www.linuxhint.com , kuras saglabāšanai atmiņā būs nepieciešami 18 baiti, ieskaitot rakstzīmi Null virknes beigās. Pēc tam mēs esam deklarējuši citu rakstzīmju masīvu, ti, galamērķa_str ar izmēru tikai 5. Tātad, galamērķa_str nevar turēt avota virkni ar kopējo lielumu 18 baiti.

Tomēr mēs izsaucam funkciju strcpy (), lai kopētu avota virkni uz mērķa virkni. No zemāk redzamās izejas mēs varam redzēt, ka strcpy () vispār nesūdzējās. Šādā gadījumā funkcija strcpy () sāks rakstzīmes kopēšanu no avota virknes (līdz avota virknē tiek atrasta rakstzīme NULL) uz galamērķa adresi (pat ja galamērķa robeža pārsniedz). Tas nozīmē, ka funkcija strcpy () neveic galamērķa masīva robežu pārbaudi. Galu galā funkcija strcpy () pārrakstīs atmiņas adreses, kas nav piešķirtas mērķa masīvam. Tāpēc funkcija strcpy () pārrakstīs atmiņas vietas, kuras varētu tikt piešķirtas citam mainīgajam.

Šajā piemērā no zemāk redzamās izejas mēs varam redzēt, ka funkcija strcpy () pārraksta pašu avota virkni. Programmētājiem vienmēr jābūt uzmanīgiem ar šādu uzvedību.

#iekļaut
#iekļaut

intgalvenais()
{
charsource_str[] = 'www.linuxhint.com';
chargalamērķa_str[5];

printf ('Pirms izsaukt funkciju strcpy (): n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

strcpy (galamērķa_str,source_str);

printf ('Pēc funkcijas strcpy () izpildes: n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

// printf ('Avota adrese = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('Galamērķa adrese = %u (0x %x) n', & galamērķa_str [0] un galamērķa_str [0]);

atgriezties 0;
}

strcpy ()-2. gadījums (3.c piemērs):

Šī programma ilustrē situāciju, kad galamērķa virknes lielums ir lielāks par avota virknes lielumu un mērķa virkne jau ir inicializēta ar kādu vērtību. Šajā piemērā mēs esam inicializējuši:

  • source_str to www.linuxhint.com [izmērs = 17+1 = 18]
  • galamērķa_str līdz I_AM_A_DESTINATION_STRING [size = 25+1 = 26]

Funkcija strcpy () kopēs visas 17 rakstzīmes un NULL rakstzīmi no avota virknes uz mērķa virkni. Bet tas neaizstās/nemainīs atlikušos baitus (19. līdz 26. baits, viens balstīts) mērķa masīvā. Mēs esam izmantojuši ciklu, lai atkārtotu galamērķa masīvu un izdrukātu visu masīvu, lai pierādītu, ka baiti-19 līdz 26 galamērķa masīvā nav mainīti. Tāpēc pēdējo izvadi mēs redzam šādi:

www.linuxhint.com_STRING .

#iekļaut
#iekļaut


/* Šī programma ilustrē situāciju, kad:

galamērķa virknes lielums> avota virknes lielums

un mēs izpildām funkciju strcpy (), lai kopētu
avota virkne līdz galamērķim.

Piezīme. Galamērķa virknes lielumam vienmēr jābūt
jābūt lielākam vai vienādam ar avota virkni.
* /

intgalvenais()
{
charsource_str[] = 'www.linuxhint.com';
chargalamērķa_str[26] = “I_AM_A_DESTINATION_STRING”;

printf ('Pirms izsaukt funkciju strcpy (): n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

strcpy (galamērķa_str,source_str);

printf ('Pēc funkcijas strcpy () izpildes: n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);


/* drukājiet galamērķa virkni, izmantojot cilpu*/
printf ('Drukājiet galamērķa virkni char pēc char: n n');
printf (' tGalamērķa virkne = ');

priekš(inti=0;i<25;i++)
{
printf ('% c',galamērķa_str[i]);
}
printf (' n n');

atgriezties 0;
}

strcpy ()-3. gadījums (4.c piemērs):

Mēs uzskatījām šo programmu par piemēru, lai parādītu, ka mēs nekad nedrīkstam izsaukt strcpy () ar burtu virkni kā galamērķi. Tas izraisīs nenoteiktu uzvedību un galu galā programma avarēs.

#iekļaut
#iekļaut

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

printf ('Pirms izsaukt funkciju strcpy (): n n');
printf (' tAvota virkne = %s n',source_str);

/* Nekad nesauciet strcpy () ar burtu virkni kā galamērķi.
Programma avarēs.
* /

strcpy ('destination_str',source_str);

printf ('Pēc funkcijas strcpy () izpildes: n n');
printf (' tAvota virkne = %s n',source_str);

atgriezties 0;
}

strcpy () - lietotāja definēta versija (piemērs5.c):

Šajā programmas paraugā mēs esam parādījuši, kā uzrakstīt lietotāja definētu funkcijas strcpy () versiju.

#iekļaut
char *strcpy_user_defined(char *dest, konst char *src);

/ * Lietotāja definēta funkcijas strcpy () versija */
char *strcpy_user_defined(char *dest, konst char *src)
{
char *dest_backup=dest;

kamēr(*src! = ' 0') /* Atkārtojiet, līdz tiek atrasts ' 0'.*/
{
*dest= *src; / * Kopēt avota simbolu uz galamērķi */
src++; / * Palielināt avota rādītāju */
dest++; / * Palielināt mērķa rādītāju */
}

*dest= ' 0'; /* Skaidri ievietojiet galamērķī “ 0”*/

atgrieztiesdest_backup;
}

intgalvenais()
{
charsource_str[] = 'www.linuxhint.com';
chargalamērķa_str[30];

printf (Pirms zvanāt lietotāja definētai virknes kopēšanas funkcijai: n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

/ * Izsauc lietotāja definētu virkņu kopēšanas funkciju */
strcpy_user_defined(galamērķa_str,source_str);

printf ('Pēc lietotāja definētas virknes kopēšanas funkcijas izpildes: n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

atgriezties 0;
}

strcpy () - lietotāja definēta versija optimizēta (piemērs6.c):

Tagad šajā programmas paraugā mēs optimizēsim lietotāja definēto strcpy () versiju.

#iekļaut
char *strcpy_user_defined(char *dest, konst char *src);


/ * Lietotāja definētas funkcijas strcpy () optimizēta versija */
char *strcpy_user_defined(char *dest, konst char *src)
{
char *dest_backup=dest;

kamēr(*dest++ = *src++)
;

atgrieztiesdest_backup;
}

intgalvenais()
{
charsource_str[] = 'www.linuxhint.com';
chargalamērķa_str[30];

printf (Pirms zvanāt lietotāja definētai virknes kopēšanas funkcijai: n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

/ * Izsauc lietotāja definētu virkņu kopēšanas funkciju */
strcpy_user_defined(galamērķa_str,source_str);

printf ('Pēc lietotāja definētas virknes kopēšanas funkcijas izpildes: n n');
printf (' tAvota virkne = %s n',source_str);
printf (' tGalamērķa virkne = %s n n',galamērķa_str);

atgriezties 0;
}

Secinājums :

Funkcija strcpy () ir ļoti populāra un ērta bibliotēkas funkcija, lai veiktu virkņu kopēšanas darbību C programmēšanas valodā. To galvenokārt izmanto, lai kopētu virkni no vienas vietas uz citu. Tomēr mēs vēlamies atkārtot faktu, ka funkcija strcpy () neveic galamērķa masīva robežu pārbaudi, kas, ja to ignorē, var izraisīt nopietnu programmatūras kļūdu. Programmētājs vienmēr ir atbildīgs par to, lai mērķa masīvā būtu pietiekami daudz vietas, lai turētu visas avota virknes rakstzīmes, ieskaitot rakstzīmi NULL.