C Programmēšana

Kā lietot Strcpy () C valodā?

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

Sintakse:

char * strcpy (char * galamērķa vieta, const char * avota_ virkne);

Izpratne par strcpy ():

Funkcijas strcpy () vienīgais mērķis ir virknes kopēšana no avota līdz galamērķim. Tagad ļaujiet mums apskatīt iepriekš minēto strcpy () funkcijas sintaksi. Funkcija strcpy () spēj pieņemt divus parametrus -

Avots šeit ir konstante, 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ēšana ir pabeigta no avota līdz mērķim, funkcija strcpy () atgriež mērķa adresi atpakaļ zvanītāja funkcijai.

Svarīgs šeit pamanāmais ir tas, 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 pārliecinātos, ka galamērķa izmērs ir lielāks par avota virkni, par to pilnībā atbild programmētājs.

Piemēri:

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

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

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

Šis programmas piemērs parāda, kā veikt normālu virknes kopēšanas darbību, izmantojot strcpy () funkciju C programmēšanas valodā. Lūdzu, ņemiet vērā, ka galamērķa virknes garums ir 30 (char destination_str [30];), kas ir lielāks par avota virknes garumu (garums ir 18, ieskaitot NULL rakstzīmi), lai galamērķī varētu ievietot visas rakstzīmes no avota virkne.

# iekļaut
# iekļaut
int main ()

char source_str [] = "www.linuxhint.com ";
char galamērķis_str [30];
printf ("Pirms funkcijas strcpy () izsaukšanas: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
strcpy (galamērķa_str, avota_str);
printf ("Pēc strcpy () funkcijas izpildes: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
atgriešanās 0;

strcpy () - 1. lieta (2. piemērs.c):

Šīs programmas parauga 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 vietu / baitu, lai ievietotu visas rakstzīmes (ieskaitot NULL rakstzīmi) no avota virknes. Jums vienmēr jāpatur prātā divas lietas:

  1. Funkcija strcpy () nepārbaudīs, vai galamērķī ir pietiekami daudz vietas.
  2. Iegultā programmatūrā tas varētu 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 vietnē “www.linuxhint.com ”, kuras glabāšanai būs nepieciešami 18 baiti atmiņā, ieskaitot virknes beigās rakstzīmi Null. Tad mēs esam deklarējuši vēl vienu rakstzīmju masīvu i.e. destination_str ar tikai 5 lielumu. Tātad, destination_str nevar saturēt avota virkni ar kopējo izmēru 18 baiti.

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

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

# iekļaut
# iekļaut
int main ()

char source_str [] = "www.linuxhint.com ";
char galamērķis_str [5];
printf ("Pirms funkcijas strcpy () izsaukšanas: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
strcpy (galamērķa_str, avota_str);
printf ("Pēc strcpy () funkcijas izpildes: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMē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", & destination_str [0], & destination_str [0]);
atgriešanās 0;

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

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

  • avots_str uz “www.linuxhint.com ”[izmērs = 17 + 1 = 18]
  • galamērķa_str līdz “I_AM_A_DESTINATION_STRING” [izmērs = 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. baits uz 26, viens balstīts) galamērķa masīvā. Mēs esam izmantojuši cilpu, 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 mēs redzam pēdējo iznākumu kā:

“Www.linuxhint.com_STRING ”.

# iekļaut
# iekļaut
/ * Šī programma ilustrē situāciju, kad:
galamērķa virknes izmērs> avota virknes izmērs
un mēs izpildām strcpy () funkciju, lai kopētu
avota virkne līdz galamērķim.
Piezīme. Mērķa virknes lielumam vienmēr jābūt
jābūt lielākam par avota virkni vai vienādai ar to.
* /
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Pirms funkcijas strcpy () izsaukšanas: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
strcpy (galamērķa_str, avota_str);
printf ("Pēc strcpy () funkcijas izpildes: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
/ * izdrukāt mērķa virkni, izmantojot cilpu * /
printf ("Izdrukājiet mērķa virknes char ar char: \ n \ n");
printf ("\ tMērķa virkne =");
par (int i = 0; i<25;i++)

printf ("% c", galamērķa_str [i]);

printf ("\ n \ n");
atgriešanās 0;

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

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

# iekļaut
# iekļaut
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Pirms funkcijas strcpy () izsaukšanas: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
/ * Nekad neizsauciet strcpy () ar virkni literal kā galamērķi.
Programma avarēs.
* /
strcpy ("destination_str", source_str);
printf ("Pēc strcpy () funkcijas izpildes: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
atgriešanās 0;

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

Šajā programmas piemērā mēs parādījām, kā rakstīt lietotāja definētu strcpy () funkcijas versiju.

# iekļaut
char * strcpy_user_defined (char * dest, const char * src);
/ * Lietotāja definēta strcpy () funkcijas versija * /
char * strcpy_user_defined (char * dest, const 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 ++; / * Pieauguma avota rādītājs * /
dest ++; / * Palielināt mērķa rādītāju * /

* dest = '\ 0'; / * Galamērķī skaidri ievietojiet “\ 0” * /
atgriezties dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char galamērķis_str [30];
printf ("Pirms izsaukt lietotāja definētu virknes kopēšanas funkciju: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
/ * Zvana lietotāja definēta virknes kopēšanas funkcija * /
strcpy_user_defined (galamērķa_str, avota_str);
printf ("Pēc lietotāja definētas virknes kopēšanas funkcijas izpildes: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
atgriešanās 0;

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

Šajā programmas piemērā mēs optimizēsim lietotāja definēto strcpy () versiju.

# iekļaut
char * strcpy_user_defined (char * dest, const char * src);
/ * Lietotāja definētās strcpy () funkcijas optimizētā versija * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
kamēr (* dest ++ = * src ++)
;
atgriezties dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char galamērķis_str [30];
printf ("Pirms izsaukt lietotāja definētu virknes kopēšanas funkciju: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
/ * Zvana lietotāja definēta virknes kopēšanas funkcija * /
strcpy_user_defined (galamērķa_str, avota_str);
printf ("Pēc lietotāja definētas virknes kopēšanas funkcijas izpildes: \ n \ n");
printf ("\ t avota virkne =% s \ n", avota_str);
printf ("\ tMērķa virkne =% s \ n \ n", galamērķa_str);
atgriešanās 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 virknes kopēšanai no vienas vietas uz citu. Tomēr mēs vēlamies atkārtot faktu, ka funkcija strcpy () neveic mērķa masīva robežu pārbaudi, kas, ja to neievēro, var izraisīt nopietnu programmatūras kļūdu. Programmētājs vienmēr ir atbildīgs par to, lai galamērķa masīvā būtu pietiekami daudz vietas, lai turētu visas rakstzīmes no avota virknes, ieskaitot NULL rakstzīmi.

Komerciālo spēļu dzinēju atvērtā koda porti
Bezmaksas, atvērtā koda un starpplatformu spēļu dzinēju atpūtu var izmantot, lai spēlētu vecos, kā arī dažus no diezgan nesenajiem spēļu nosaukumiem. ...
Labākās komandrindas spēles Linux
Komandrinda nav tikai lielākais sabiedrotais, lietojot Linux, bet tā var būt arī izklaides avots, jo to var izmantot, lai spēlētu daudzas jautras spēl...
Labākās Linux spēļu gamepad kartēšanas lietotnes
Ja jums patīk spēlēt spēles Linux ar parastu tastatūru, nevis parasto tastatūru un peles ievades sistēmu, jums ir dažas noderīgas lietotnes. Daudzas d...