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:
- strcpy () - Normaali toiminta (esimerkki1.c)
- strcpy ()-Tapaus-1 (esimerkki2.c)
- strcpy ()-Tapaus-2 (esimerkki3.c)
- strcpy ()-Tapaus-3 (esimerkki4.c)
- strcpy () - Käyttäjän määrittämä versio (esimerkki5.c)
- 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ä:
- Strcpy () -toiminto ei tarkista, onko kohteessa tarpeeksi tilaa.
- 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:
#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.