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 -
- char * rendeltetési hely
- const char * forrás
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:
- strcpy () - Normál működés (példa1.c)
- strcpy () - 1. eset (példa2.c)
- strcpy () - 2. eset (példa3.c)
- strcpy () - 3. eset (példa4.c)
- strcpy () - Felhasználó által definiált verzió (példa5.c)
- 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:
- Az strcpy () függvény nem ellenőrzi, hogy van-e a célnak elegendő hely.
- 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.
#includechar * 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.
#includechar * 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.