C programozás

Az Strcpy () használata C nyelven?

Az Strcpy () használata C nyelven?
Ebben a cikkben megismerjük az strcpy () függvényt a C programozási nyelven. Az strcpy () függvény nagyon népszerű szabványos könyvtárfüggvény, amely a string másolási műveletet a C programozási nyelven hajtja végre. Számos szabványos fejlécfájl található C programozási nyelven a szokásos műveletek végrehajtásához. A húr.A h ”egy ilyen fejlécfájl, amely számos szabványos könyvtárfunkciót biztosít a karakterlánc műveletek végrehajtásához. Az „strcpy ()” függvény a „string” által biztosított könyvtárfunkciók egyike.h ”.

Szintaxis:

char * strcpy (char * rendeltetési hely, const char * forrás_húr);

Az strcpy () megértése:

Az strcpy () függvény egyetlen célja egy karakterlánc forrásról célra másolása. Most nézzük meg az strcpy () függvény fenti szintaxisát. Az strcpy () függvény két paraméter elfogadására képes -

A forrás itt állandó, hogy az strcpy () függvény ne tudja megváltoztatni a forrás karakterláncot. Az strcpy () függvény az összes karaktert (beleértve a karakterlánc végén lévő NULL karaktert is) átmásolja a forrás karakterláncból a célba. Miután a másolási művelet befejeződött a forrástól a célig, az strcpy () függvény visszaadja a cél címét a hívó függvénynek.

Fontos észrevenni, hogy az strcpy () függvény nem fűzi hozzá a forrás karakterláncot a cél karakterlánccal. Inkább helyettesíti a rendeltetési hely tartalmát a forrás karakterlánc tartalmával.

Az strcpy () függvény nem végez ellenőrzést annak biztosítására, hogy a cél mérete nagyobb legyen, mint a forrás karakterlánc, ez teljesen a programozó felelőssége.

Példák:

Most számos példát fogunk látni az strcpy () függvény megértéséhez:

  1. strcpy () - Normál működés (példa1.c)
  2. strcpy () - 1. eset (példa2.c)
  3. strcpy () - 2. eset (példa3.c)
  4. strcpy () - 3. eset (példa4.c)
  5. strcpy () - Felhasználó által definiált verzió (példa5.c)
  6. strcpy () - Felhasználó által definiált verzió optimalizált (példa6.c)

strcpy () - Normál működés (példa1.c):

Ez a példa program bemutatja, hogyan lehet normál karakterlánc-másolási műveletet végrehajtani az strcpy () függvény segítségével a C programozási nyelven. Felhívjuk figyelmét, hogy a cél karaktersorozat hossza 30 (char destination_str [30];), amely nagyobb, mint a forrás karaktersorozat hossza (a NULL karaktert is beleértve a hossza 18), hogy a cél az összes karaktert el tudja fogadni. forrás karakterlánc.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char rendeltetési hely_str [30];
printf ("Az strcpy () függvény meghívása előtt: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
strcpy (cél_str, forrás_str);
printf ("Az strcpy () függvény végrehajtása után: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
visszatér 0;

strcpy () - 1. eset (példa2.c):

Ennek a példa programnak az a célja, hogy világosan elmagyarázza, mi történik, ha a cél karakterlánc hossza kisebb, mint a forrás karakterlánc hossza. Ilyen esetekben a célhelyen nem lesz elég szóköz / bájt a forrás karakterlánc összes karakterének (beleértve a NULL karaktert is) elhelyezéséhez. Két dolgot mindig szem előtt kell tartanod:

  1. Az strcpy () függvény nem ellenőrzi, hogy van-e a célnak elegendő hely.
  2. Ez veszélyes lehet a beágyazott szoftverekben, mert az strcpy () helyettesíti a célterületen túli memóriaterületet.

Nézzük meg a példa programot. Deklaráltuk a source_str fájlt és inicializáltuk a „www.linuxhint.com ”, amelynek tárolásához 18 bájt szükséges a memóriában, beleértve a Null karaktert is a karakterlánc végén. Aztán deklaráltunk egy másik karaktertömböt i.e. destination_str csak 5 méretű. Tehát a destination_str nem tudja megtartani a 18 bájt méretű forrás karakterláncot.

De mégis meghívjuk az strcpy () függvényt, hogy a forrás karakterláncot átmásoljuk a cél karakterláncba. Az alábbi kimenetből láthatjuk, hogy az strcpy () egyáltalán nem panaszkodott. Ebben az esetben az strcpy () függvény elkezdi másolni a karaktert a forrás karakterláncból (amíg meg nem találja a NULL karaktert a forrás karakterláncban) a cél címre (annak ellenére, hogy a célhatár meghaladja). Ez azt jelenti, hogy az strcpy () függvény nem végez határellenőrzést a céltömbön. Végül az strcpy () függvény felülírja azokat a memóriacímeket, amelyek nincsenek hozzárendelve a céltömbhöz. Ezért az strcpy () függvény végül felülírja azokat a memóriahelyeket, amelyek esetleg egy másik változóhoz vannak hozzárendelve.

Ebben a példában az alábbi kimenetből láthatjuk, hogy az strcpy () függvény felülírja magát a forrás karakterláncot. A programozóknak mindig óvatosnak kell lenniük ilyen viselkedéssel.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
char rendeltetési hely_str [5];
printf ("Az strcpy () függvény meghívása előtt: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
strcpy (cél_str, forrás_str);
printf ("Az strcpy () függvény végrehajtása után: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
// printf ("Forráscím =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Cím címe =% u (0x% x) \ n", & cél_str [0], & cél_str [0]);
visszatér 0;

strcpy () - 2. eset (példa3.c):

Ez a program azt a helyzetet szemlélteti, amikor a cél karakterlánc mérete nagyobb, mint a forrás karakterlánc mérete, és a cél karakterlánc már inicializálva van valamilyen értékkel. Ebben a példában inicializáltuk:

  • forrás_str a “www.linuxhint.com ”[méret = 17 + 1 = 18]
  • Úticél_str "I_AM_A_DESTINATION_STRING" -ig [méret = 25 + 1 = 26]

Az strcpy () függvény mind a 17 karaktert és a NULL karaktert átmásolja a forrás karakterláncból a cél karakterláncba. De ez nem fogja helyettesíteni / megváltoztatni a cél tömbben a fennmaradó bájtokat (19. bájt 26-ról 26-ra, egy alapú). A ciklus segítségével ismételtük a cél tömböt, és kinyomtattuk az egész tömböt, hogy bebizonyítsuk, hogy a 19 és 26 közötti bájtok változatlanok a cél tömbben. Ezért látjuk az utolsó kimenetet:

„Www.linuxhint.com_STRING ”.

#include
#include
/ * Ez a program azt a helyzetet szemlélteti, amikor:
cél karakterlánc mérete> forrás karakterlánc mérete
és végrehajtjuk az strcpy () függvényt a
forrás karakterlánc a célig.
Megjegyzés: A cél karakterlánc méretének mindig meg kell lennie
nagyobb vagy egyenlő a forrás karakterlánccal.
* /
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Az strcpy () függvény meghívása előtt: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
strcpy (cél_str, forrás_str);
printf ("Az strcpy () függvény végrehajtása után: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
/ * nyomtassa ki a célláncot a hurokhoz * /
printf ("A cél karakterlánc char nyomtatása char-val: \ n \ n");
printf ("\ tDestination String =");
mert (int i = 0; i<25;i++)

printf ("% c", rendeltetési_str [i]);

printf ("\ n \ n");
visszatér 0;

strcpy () - 3. eset (példa4.c):

Ezt a programot példának tekintettük annak bemutatására, hogy soha ne hívjuk meg az strcpy () karakterláncot literal célként. Ez meghatározatlan viselkedést okoz, és végül a program összeomlik.

#include
#include
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Az strcpy () függvény meghívása előtt: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
/ * Soha ne hívja az strcpy () karakterláncot szó szerinti célként.
A program összeomlik.
* /
strcpy ("cél_str", forrás_str);
printf ("Az strcpy () függvény végrehajtása után: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
visszatér 0;

strcpy () - Felhasználó által definiált verzió (példa5.c):

Ebben a példaprogramban megmutattuk, hogyan kell írni az strcpy () függvény felhasználó által definiált verzióját.

#include
char * strcpy_user_defined (char * dest, const char * src);
/ * Az strcpy () függvény felhasználó által definiált verziója * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
míg (* src != '\ 0') / * Addig iterál, amíg a '\ 0' kifejezés meg nem jelenik.* /

* dest = * src; / * Másolja a forrás karaktert a célba * /
src ++; / * Növekszik a forrásmutató * /
dest ++; / * Növekszik a célmutató * /

* dest = '\ 0'; / * Pontosan illessze be a „\ 0” -t a rendeltetési helyre
return dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char rendeltetési hely_str [30];
printf ("Mielőtt felhívná a felhasználó által megadott karakterlánc-másolási funkciót: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
/ * Felhasználó által megadott karakterlánc másolási funkció hívása
strcpy_user_defined (cél_str, forrás_str);
printf ("A felhasználó által megadott karakterlánc-másolási funkció végrehajtása után: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
visszatér 0;

strcpy () - Felhasználó által definiált verzió optimalizált (példa6.c):

Most ebben a példaprogramban optimalizálni fogjuk az strcpy () felhasználó által definiált verzióját.

#include
char * strcpy_user_defined (char * dest, const char * src);
/ * A felhasználó által definiált strcpy () függvény optimalizált verziója * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
míg (* dest ++ = * src ++)
;
return dest_backup;

int main ()

char source_str [] = "www.linuxhint.com ";
char rendeltetési hely_str [30];
printf ("Mielőtt felhívná a felhasználó által megadott karakterlánc-másolási funkciót: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
/ * Felhasználó által megadott karakterlánc másolási funkció hívása
strcpy_user_defined (cél_str, forrás_str);
printf ("A felhasználó által megadott karakterlánc-másolási funkció végrehajtása után: \ n \ n");
printf ("\ tForráslánc =% s \ n", forrás_str);
printf ("\ tCélzási karakterlánc =% s \ n \ n", cél_str);
visszatér 0;

Következtetés:

Az strcpy () függvény nagyon népszerű és praktikus könyvtárfunkció a string másolási művelet végrehajtására a C programozási nyelven. Ezt főleg a karakterlánc egyik helyről a másikra történő másolására használják. Szeretnénk megismételni azt a tényt, hogy az strcpy () függvény nem végzi el a céltömb határellenőrzését, ami figyelmen kívül hagyva súlyos szoftverhibához vezethet. Mindig a programozó felelőssége, hogy megbizonyosodjon arról, hogy a céltömbben van-e elegendő hely a forrás karakterlánc összes karakterének, beleértve a NULL karaktert is.

Sid Meier Civilization VI letöltése és lejátszása Linuxon
Bevezetés a játékba A Civilization 6 egy modern felvétel a Age of Empires játékok sorozatában bevezetett klasszikus koncepcióra. Az ötlet meglehetősen...
A Doom telepítése és lejátszása Linuxon
Bevezetés a Doom-ba A Doom sorozat a 90-es években keletkezett az eredeti Doom megjelenése után. Azonnali sláger volt, és ettől kezdve a játéksorozat ...
Vulkan Linux felhasználók számára
A grafikus kártyák minden új generációjával azt látjuk, hogy a játékfejlesztők átlépik a grafikus hűség határait, és egy lépéssel közelebb kerülnek a ...