Szintaxis:
char* strcpy (char*rendeltetési_hely, const char*source_string);Az strcpy () értelmezése:
Az strcpy () függvény egyetlen célja egy karakterlánc másolása a forrásból a célállomásba. Most nézzük meg az strcpy () függvény fenti szintaxisát. Az strcpy () függvény két paramétert képes elfogadni -
- char * úti cél
- const char * forrás
A forrás itt konstans annak biztosítására, 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) a forrás karakterláncból a célállomásra másolja. Miután a másolási művelet befejeződött a forrásról a célállomásra, az strcpy () függvény visszaadja a cél címét a hívó funkciónak.
Itt fontos megjegyezni, hogy az strcpy () függvény nem fűzi hozzá a forrás karakterláncot a cél karakterlánccal. Inkább a cél tartalmát helyettesíti a forrás karakterlánc tartalmával.
Ezenkívül az strcpy () függvény nem végez semmilyen ellenőrzést annak biztosítására, hogy a cél mérete nagyobb legyen, mint a forrás karakterlánc, ez teljes mértékben a programozó felelőssége.
Példák:
Most több példát fogunk látni az strcpy () függvény megértésére:
- strcpy () - Normál működés (példa 1.c)
- strcpy ()-1. eset (2.c példa)
- strcpy ()-2. eset (3.c példa)
- strcpy ()-3. eset (4.c példa)
- strcpy () - Felhasználó által meghatározott verzió (példa 5.c)
- strcpy () - a felhasználó által meghatározott verzió optimalizálva (példa 6.c)
strcpy () - Normál működés (példa1.c):
Ez a példaprogram bemutatja, hogyan lehet normál karakterlánc -másolási műveletet végrehajtani a C programozási nyelv strcpy () függvényével. Kérjük, vegye figyelembe, hogy a cél karakterlánc hossza 30 (char destination_str [30];), ami nagyobb, mint a forrás karakterlánc hossza (hossza 18, beleértve a NULL karaktert), így a célállomás el tudja helyezni a forrás karakterlánc.
#befoglalni
#befoglalni
intfő-()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[30];
printf ('Az strcpy () függvény hívása előtt: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
strcpy (destination_str,source_str);
printf ('Az strcpy () függvény végrehajtása után: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
Visszatérés 0;
}
strcpy ()-1. eset (2.c példa):
Ennek a példaprogramnak 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 rendeltetési hely nem tartalmaz elegendő szóközt/bájtot a forrás karakterlánc összes karakterének (beleértve a NULL karaktert) elhelyezéséhez. Két dolgot mindig szem előtt kell tartania:
- Az strcpy () függvény nem ellenőrzi, hogy van -e elegendő hely a rendeltetési helyen.
- Ez veszélyes lehet a beágyazott szoftverekben, mert az strcpy () lecseréli a memóriaterületet a célhatáron túl.
Nézzük a példaprogramot. A source_str -t deklaráltuk és inicializáltuk www.linuxhint.com , amelynek tárolása 18 bájtot vesz igénybe a memóriában, beleértve a karakterlánc végén található Null karaktert is. Ezután deklaráltunk egy másik karakter tömböt, azaz a rendeltetési_str, amelynek mérete csak 5. Tehát a cél_str nem tudja megtartani a 18 bájtos teljes karakterláncot.
Ennek ellenére meghívjuk az strcpy () függvényt, hogy a forrás karakterláncot a cél karakterláncba másoljuk. Az alábbi kimeneten 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ásláncban) a célcí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 számára. 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 az oka annak, hogy az strcpy () függvény végül felülírja azokat a memóriahelyeket, amelyeket egy másik változóhoz rendelhetnek hozzá.
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 az ilyen viselkedéssel.
#befoglalni#befoglalni
intfő-()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[5];
printf ('Az strcpy () függvény hívása előtt: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
strcpy (destination_str,source_str);
printf ('Az strcpy () függvény végrehajtása után: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
// printf ('Forráscím = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('Célcím = %u (0x %x) n', & cél_str [0], & cél_str [0]);
Visszatérés 0;
}
strcpy ()-2. eset (3.c példa):
Ez a program szemlélteti azt a helyzetet, 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:
- source_str to www.linuxhint.com [méret = 17+1 = 18]
- target_str - I_AM_A_DESTINATION_STRING [méret = 25+1 = 26]
Az strcpy () függvény mind a 17 karaktert és a NULL karaktert a forrás karakterláncból a cél karakterláncba másolja. Ez azonban nem helyettesíti/módosítja a többi tömböt (19 - 26 bájt, egy alapú) a céltömbben. Azt használtuk, hogy a ciklus iteráljon a cél tömb felett, és kinyomtassa a teljes tömböt annak bizonyítására, hogy a 19-26 bájtok változatlanok a céltömbben. Ezért látjuk az utolsó kimenetet:
#befoglalni#befoglalni
/* Ez a program szemlélteti a helyzetet, 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 rendeltetési helyre.
Megjegyzés: A cél karakterlánc mérete mindig legyen
nagyobb vagy egyenlő a forrás karakterlánccal.
* /
intfő-()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[26] = 'I_AM_A_DESTINATION_STRING';
printf ('Az strcpy () függvény hívása előtt: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
strcpy (destination_str,source_str);
printf ('Az strcpy () függvény végrehajtása után: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
/* a cél karakterlánc nyomtatása a ciklushoz*/
printf ('Nyomtassa ki a cél karakterláncot karakterrel char: n n');
printf (' tCél karakterlánc = ');
számára(intén=0;én<25;én++)
{
printf ('% c',destination_str[én]);
}
printf (' n n');
Visszatérés 0;
}
strcpy ()-3. eset (4.c példa):
Ezt a programot példának tekintettük, hogy megmutassuk, hogy soha ne hívjuk az strcpy () parancsot karakterlánccal. Ez meghatározatlan viselkedést okoz, és végül a program összeomlik.
#befoglalni#befoglalni
intfő-()
{
charsource_str[] = 'www.linuxhint.com';
printf ('Az strcpy () függvény hívása előtt: n n');
printf (' tForrás karakterlánc = %s n',source_str);
/* Soha ne hívja meg az strcpy () parancsot, ahol a karakterlánc karakterlánc.
A program összeomlik.
* /
strcpy ('destination_str',source_str);
printf ('Az strcpy () függvény végrehajtása után: n n');
printf (' tForrás karakterlánc = %s n',source_str);
Visszatérés 0;
}
strcpy () - Felhasználó által meghatározott verzió (példa 5.c):
Ebben a példaprogramban megmutattuk, hogyan kell írni az strcpy () függvény felhasználó által meghatározott verzióját.
#befoglalnichar *strcpy_user_defined(char *dest, const char *src);
/ * Az strcpy () függvény felhasználó által meghatározott változata */
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backup=dest;
míg(*src! = ' 0') /* Ismételje, amíg a ' 0' nem található.*/
{
*dest= *src; / * A forrás karakter másolása a rendeltetési helyre */
src++; / * Növelési forrásmutató */
dest++; / * Célmutató növelése */
}
*dest= ' 0'; /* A ' 0' kifejezést kifejezetten illessze be a rendeltetési helyre*/
Visszatérésdest_backup;
}
intfő-()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[30];
printf ('Mielőtt a felhasználó által megadott karakterlánc -másolási funkciót hívná: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
/ * A felhasználó által megadott karakterlánc másolási funkció hívása */
strcpy_user_defined(destination_str,source_str);
printf ('A felhasználó által megadott karakterlánc -másolási funkció végrehajtása után: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
Visszatérés 0;
}
strcpy () - A felhasználó által meghatározott verzió optimalizálva (példa 6.c):
Most ebben a példaprogramban az strcpy () felhasználó által meghatározott verzióját optimalizáljuk.
#befoglalnichar *strcpy_user_defined(char *dest, const char *src);
/ * A felhasználó által definiált strcpy () függvény optimalizált változata */
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backup=dest;
míg(*dest++ = *src++)
;
Visszatérésdest_backup;
}
intfő-()
{
charsource_str[] = 'www.linuxhint.com';
chardestination_str[30];
printf ('Mielőtt a felhasználó által megadott karakterlánc -másolási funkciót hívná: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
/ * A felhasználó által megadott karakterlánc másolási funkció hívása */
strcpy_user_defined(destination_str,source_str);
printf ('A felhasználó által megadott karakterlánc -másolási funkció végrehajtása után: n n');
printf (' tForrás karakterlánc = %s n',source_str);
printf (' tCél karakterlánc = %s n n',destination_str);
Visszatérés 0;
}
Következtetés :
Az strcpy () függvény egy nagyon népszerű és praktikus könyvtári funkció a karakterlánc -másolási művelet végrehajtásához C programozási nyelven. Ez főleg a karakterlánc másolására szolgál egyik helyről a másikra. Szeretnénk azonban 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 komoly szoftverhibához vezethet. Mindig a programozó feladata, hogy megbizonyosodjon arról, hogy a céltömb rendelkezik elegendő hellyel a forrás karakterlánc összes karakterének megtartásához, beleértve a NULL karaktert is.