Kuinka käyttää Strcpy (): tä C -kielellä?

How Use Strcpy C Language



Tässä artikkelissa aiomme oppia strcpy () -funktiosta C -ohjelmointikielellä. Strcpy () -funktio on erittäin suosittu vakiokirjasto -toiminto, joka suorittaa merkkijonokopioinnin C -ohjelmointikielellä. C -ohjelmointikielellä on useita vakiotunnistetiedostoja vakiotoimintojen suorittamiseen. String.h on yksi tällaisista otsikkotiedostoista, joka tarjoaa useita vakiokirjasto -toimintoja merkkijonotoimintojen suorittamiseen. Funktio strcpy () on yksi string.h: n tarjoamista kirjastotoiminnoista.

Syntaksi:

hiiltyä* strcpy (hiiltyä*määränpää_sijainti, const hiiltyä*source_string);

Strcpy (): n ymmärtäminen:

Strcpy () -funktion ainoa tarkoitus on kopioida merkkijono lähteestä kohteeseen. Katsotaanpa nyt yllä olevaa strcpy () -funktion syntaksia. Funktio strcpy () voi hyväksyä kaksi parametria -





  • char * määränpää
  • const char * lähde

Lähde on vakio, jotta varmistetaan, että strcpy () -toiminto ei voi muuttaa lähdejonoa. Funktio strcpy () kopioi kaikki merkit (myös merkkijonon lopussa olevan NULL -merkin) lähdejonosta kohteeseen. Kun kopiointi on valmis lähteestä kohteeseen, strcpy () -toiminto palauttaa kohteen osoitteen takaisin soittotoimintoon.



Tärkeä huomioitava asia on, että strcpy () -toiminto ei liitä lähdejonoa kohdejonoon. Se pikemminkin korvaa kohteen sisällön lähdejonon sisällöllä.



Myöskään strcpy () -toiminto ei suorita tarkistuksia varmistaakseen, että määränpää on suurempi kuin lähdemerkkijono, se on täysin ohjelmoijan vastuulla.





Esimerkkejä:

Nyt näemme useita esimerkkejä strcpy () -funktion ymmärtämiseksi:

  1. strcpy () - Normaali toiminta (esimerkki1.c)
  2. strcpy ()-Tapaus-1 (esimerkki2.c)
  3. strcpy ()-Tapaus-2 (esimerkki3.c)
  4. strcpy ()-Tapaus-3 (esimerkki4.c)
  5. strcpy () - Käyttäjän määrittämä versio (esimerkki5.c)
  6. strcpy () - Käyttäjän määrittämä versio optimoitu (esimerkki6.c)

strcpy () - Normaali toiminta (esimerkki1.c):

Tässä esimerkkiohjelmassa näytetään, miten suoritetaan normaali merkkijonokopiointi käyttämällä ohjelmointikielen C funktiota strcpy (). Huomaa, että kohdejonon pituus on 30 (char target_str [30];), joka on suurempi kuin lähdemerkkijonon pituus (pituus on 18, sisältäen NULL -merkin), jotta kohde mahtuu kaikkiin lähdejono.



#sisältää
#sisältää

inttärkein()
{
hiiltyäsource_str[] = 'www.linuxhint.com';
hiiltyämääränpää_str[30];

printf ('Ennen kuin kutsut strcpy () -funktiota: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

strcpy (määränpää_str,source_str);

printf ('Kun olet suorittanut strcpy () -toiminnon: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

palata 0;
}

strcpy ()-Tapaus-1 (esimerkki2.c):

Tämän esimerkkiohjelman tarkoituksena on selittää selvästi, mitä tapahtuu, kun kohdejonon pituus on pienempi kuin lähdemerkkijonon pituus. Tällaisissa tapauksissa kohdesijainnissa ei ole tarpeeksi välilyöntejä/tavuja, jotta kaikki merkkijonot (mukaan lukien NULL -merkki) mahtuvat lähdejonosta. Kaksi asiaa, jotka sinun tulee aina pitää mielessä:

  1. Strcpy () -toiminto ei tarkista, onko kohteessa tarpeeksi tilaa.
  2. Tämä voi olla vaarallista sulautetuissa ohjelmistoissa, koska strcpy () korvaa muistialueen kohteen rajan ulkopuolella.

Katsotaanpa esimerkkiohjelmaa. Olemme ilmoittaneet source_str ja alustaneet sen www.linuxhint.com , joka tallentaa 18 tavua muistiin, mukaan lukien merkkijonon lopussa oleva Null -merkki. Sitten olemme ilmoittaneet toisen merkkiryhmän eli kohde_str, jonka koko on vain 5. Joten kohde_str ei voi pitää lähdejonoa, jonka kokonaiskoko on 18 tavua.

Silti me kutsumme strcpy () -funktiota kopioimaan lähdemerkkijonon kohdejonoon. Alla olevasta tuotoksesta näemme, että strcpy () ei valittanut lainkaan. Tässä tapauksessa strcpy () -toiminto alkaa kopioida merkin lähdejonosta (kunnes löytää NULL -merkin lähdejonosta) kohdeosoitteeseen (vaikka kohteen raja ylittyy). Tämä tarkoittaa, että strcpy () -toiminto ei tee kohdetaulukon reunatarkistusta. Lopulta strcpy () -toiminto korvaa muistiosoitteet, joita ei ole kohdistettu kohderyhmälle. Tämän vuoksi strcpy () -toiminto korvaa muistipaikat, jotka saatetaan varata eri muuttujalle.

Tässä esimerkissä alla olevasta ulostulosta voidaan nähdä, että strcpy () -funktio korvaa itse lähdemerkkijonon. Ohjelmoijien tulee aina olla varovaisia ​​tällaisen käyttäytymisen kanssa.

#sisältää
#sisältää

inttärkein()
{
hiiltyäsource_str[] = 'www.linuxhint.com';
hiiltyämääränpää_str[5];

printf ('Ennen kuin kutsut strcpy () -funktiota: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

strcpy (määränpää_str,source_str);

printf ('Kun olet suorittanut strcpy () -toiminnon: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

// printf ('Lähdeosoite = %u (0x %x) n', & source_str [0] ja & source_str [0]);
// printf ('Kohdeosoite = %u (0x %x) n', & määränpään_str [0] ja kohde_str [0]);

palata 0;
}

strcpy ()-Tapaus-2 (esimerkki3.c):

Tämä ohjelma kuvaa tilannetta, kun kohdamerkkijonon koko on suurempi kuin lähdemerkkikoko ja kohdejono on jo alustettu jollakin arvolla. Tässä esimerkissä olemme alustaneet:

  • source_str kohteeseen www.linuxhint.com [koko = 17+1 = 18]
  • määränpää_str kohteeseen I_AM_A_DESTINATION_STRING [koko = 25+1 = 26]

Strcpy () -toiminto kopioi kaikki 17 merkkiä ja NULL -merkin lähdemerkkistä kohdamerkkijonoon. Se ei kuitenkaan korvaa/muuta jäljellä olevia tavuja (tavu 19 - 26, yksi perustuu) kohdetaulukossa. Olemme käyttäneet silmukkaa iteroimaan kohdetaulukon yli ja tulostamaan koko taulukon todistamaan, että tavut-19-26 ovat muuttumattomia kohdetaulukossa. Siksi näemme viimeisen tuloksen seuraavasti:

www.linuxhint.com_STRING .

#sisältää
#sisältää


/* Tämä ohjelma kuvaa tilannetta, kun:

kohdejonon koko> lähdejonon koko

ja suoritamme strcpy () -toiminnon kopioidaksesi
lähdejono kohteeseen.

Huomautus: Kohdamerkkijonon koon tulee aina olla
olla suurempi tai yhtä suuri kuin lähdejono.
* /

inttärkein()
{
hiiltyäsource_str[] = 'www.linuxhint.com';
hiiltyämääränpää_str[26] = 'I_AM_A_DESTINATION_STRING';

printf ('Ennen kuin kutsut strcpy () -funktiota: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

strcpy (määränpää_str,source_str);

printf ('Kun olet suorittanut strcpy () -toiminnon: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);


/* tulosta kohdejono käyttämällä silmukkaa*/
printf ('Tulosta kohdamerkkijono char merkillä: n n'');
printf ('' tKohteen merkkijono = ');

varten(inti=0;i<25;i++)
{
printf ('% c',määränpää_str[i]);
}
printf ('' n n'');

palata 0;
}

strcpy ()-Tapaus-3 (esimerkki4.c):

Olemme pitäneet tätä ohjelmaa esimerkkinä osoittaaksemme, että meidän ei pitäisi koskaan kutsua strcpy (): tä, jonka merkkijono on literaali. Tämä aiheuttaa määrittelemätöntä käyttäytymistä ja lopulta ohjelma kaatuu.

#sisältää
#sisältää

inttärkein()
{
hiiltyäsource_str[] = 'www.linuxhint.com';

printf ('Ennen kuin kutsut strcpy () -funktiota: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);

/* Älä koskaan soita strcpy (): lle, jos merkkijono on kirjaimena.
Ohjelma kaatuu.
* /

strcpy ('määränpää_str',source_str);

printf ('Kun olet suorittanut strcpy () -toiminnon: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);

palata 0;
}

strcpy () - Käyttäjän määrittämä versio (esimerkki5.c):

Tässä esimerkkiohjelmassa olemme osoittaneet, kuinka kirjoittaa käyttäjän määrittämä versio strcpy () -funktiosta.

#sisältää
hiiltyä *strcpy_user_defined(hiiltyä *dest, const hiiltyä *src);

/ * Käyttäjän määrittämä versio strcpy () -funktiosta */
hiiltyä *strcpy_user_defined(hiiltyä *dest, const hiiltyä *src)
{
hiiltyä *dest_backup=dest;

sillä aikaa(*src! = '' 0'') /* Toista, kunnes ' 0' löytyy.*/
{
*dest= *src; / * Kopioi lähdemerkki kohteeseen */
src++; / * Lisäyslähteen osoitin */
dest++; / * Lisää kohdeosoitinta */
}

*dest= '' 0''; /* Lisää ' 0' kohteeseen nimenomaisesti*/

palatadest_backup;
}

inttärkein()
{
hiiltyäsource_str[] = 'www.linuxhint.com';
hiiltyämääränpää_str[30];

printf ('Ennen kuin soitat käyttäjän määrittämälle merkkijonon kopiointitoiminnolle: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

/ * Käyttäjän määrittämän merkkijonon kopiointitoiminnon kutsuminen */
strcpy_user_defined(määränpää_str,source_str);

printf ('Käyttäjän määrittämän merkkijonokopiointitoiminnon suorittamisen jälkeen: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

palata 0;
}

strcpy () - Käyttäjän määrittämä versio optimoitu (esimerkki6.c):

Tässä esimerkkiohjelmassa aiomme optimoida käyttäjän määrittämän version strcpy ().

#sisältää
hiiltyä *strcpy_user_defined(hiiltyä *dest, const hiiltyä *src);


/ * Käyttäjän määrittämän strcpy () -funktion optimoitu versio */
hiiltyä *strcpy_user_defined(hiiltyä *dest, const hiiltyä *src)
{
hiiltyä *dest_backup=dest;

sillä aikaa(*dest++ = *src++)
;

palatadest_backup;
}

inttärkein()
{
hiiltyäsource_str[] = 'www.linuxhint.com';
hiiltyämääränpää_str[30];

printf ('Ennen kuin soitat käyttäjän määrittämälle merkkijonon kopiointitoiminnolle: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

/ * Soittaminen käyttäjän määrittämälle merkkijonon kopiointitoiminnolle */
strcpy_user_defined(määränpää_str,source_str);

printf ('Käyttäjän määrittämän merkkijonokopiointitoiminnon suorittamisen jälkeen: n n'');
printf ('' tLähteen merkkijono = %s n'',source_str);
printf ('' tKohteen merkkijono = %s n n'',määränpää_str);

palata 0;
}

Johtopäätös :

Strcpy () -toiminto on erittäin suosittu ja kätevä kirjasto -toiminto, joka suorittaa merkkijonokopioinnin C -ohjelmointikielellä. Tätä käytetään pääasiassa merkkijonon kopioimiseen paikasta toiseen. Haluamme kuitenkin toistaa sen tosiasian, että strcpy () -toiminto ei tee kohdetaulukon rajatarkistusta, mikä voi johtaa vakavaan ohjelmistovirheeseen, jos sitä ei oteta huomioon. Ohjelmoijan vastuulla on aina varmistaa, että kohderyhmässä on tarpeeksi tilaa kaikkien merkkijonon merkkien, myös NULL -merkin, säilyttämiseksi.