Hogyan kell használni a Strcpy () nyelvet C nyelven?

How Use Strcpy C Language



Ebben a cikkben megismerkedünk a strcpy () függvénnyel a C programozási nyelven. Az strcpy () függvény egy nagyon népszerű szabványos könyvtári függvény a karakterlánc -másolási művelet végrehajtásához C programozási nyelven. Számos szabványos fejléc fájl található C programozási nyelven a szabványos műveletek végrehajtásához. A string.h az egyik ilyen fejlécfájl, amely számos szabványos könyvtári funkciót biztosít a karakterlánc -műveletek végrehajtásához. Az strcpy () függvény a string.h által biztosított egyik könyvtári függvény.

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:

  1. strcpy () - Normál működés (példa 1.c)
  2. strcpy ()-1. eset (2.c példa)
  3. strcpy ()-2. eset (3.c példa)
  4. strcpy ()-3. eset (4.c példa)
  5. strcpy () - Felhasználó által meghatározott verzió (példa 5.c)
  6. 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:

  1. Az strcpy () függvény nem ellenőrzi, hogy van -e elegendő hely a rendeltetési helyen.
  2. 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:

www.linuxhint.com_STRING .

#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.

#befoglalni
char *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.

#befoglalni
char *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.