Hvordan du bruker strcpy på c -språk?

Hvordan du bruker strcpy på c -språk?
I denne artikkelen skal vi lære om strcpy () -funksjonen på programmeringsspråket C. STRCPY () -funksjonen er en veldig populær standard bibliotekfunksjon for å utføre strengkopioperasjonen på C -programmeringsspråket. Det er flere standard overskriftsfiler på C -programmeringsspråk for å utføre standardoperasjoner. “Strengen.H ”er en av slike overskriftsfiler, som gir flere standardbibliotekfunksjoner for å utføre strengoperasjoner. "Strcpy ()" -funksjonen er en av bibliotekfunksjonene levert av "String.h ”.

Syntaks:

char* strcpy (char* destination_location, const char* source_string);

Forstå strcpy ():

Det eneste formålet med StrcPy () -funksjonen er å kopiere en streng fra kilde til destinasjon. La oss nå se på syntaks ovenfor STRCPY (). StrcPy () -funksjonen er i stand til å akseptere to parametere -

  • char * destinasjon
  • const char * kilde

Kilden er en konstant her for å sikre at StrcPy () -funksjonen ikke kan endre kildestrengen. StrcPy () -funksjonen kopierer alle tegnene (inkludert null -tegnet på slutten av strengen) fra kildestrengen til destinasjonen. Når kopieroperasjonen er fullført fra kilde til destinasjon, returnerer StrcPy () -funksjonen adressen til destinasjonen tilbake til innringerfunksjonen.

Det viktige poenget å legge merke til her er at StrcPy () -funksjonen ikke legger kildestrengen med destinasjonsstrengen. Det erstatter heller innholdet i destinasjonen med innholdet i kildestrengen.

StrcPy () -funksjonen utfører heller ingen sjekker for å sikre at størrelsen på destinasjonen er mer enn kildestrengen, det er helt programmets ansvar for programmeringen.

Eksempler:

Nå vil vi se flere eksempler for å forstå strcpy () -funksjonen:

  1. StrcPy () - Normal drift (eksempel1.c)
  2. StrcPy () - CASE -1 (Eksempel2.c)
  3. StrcPy () - Case -2 (Eksempel3.c)
  4. StrcPy () - Case -3 (Eksempel4.c)
  5. StrcPy () - Brukerdefinert versjon (Eksempel5.c)
  6. strcpy () - brukerdefinert versjon optimalisert (eksempel6.c)

StrcPy () - Normal drift (eksempel1.c):

Dette eksempelprogrammet viser hvordan du utfører en normal strengkopieringsoperasjon ved hjelp av StrcPy () -funksjonen på C -programmeringsspråket. Vær oppmerksom på at lengden på destinasjonsstrengen er 30 (char destination_str [30];), som er større enn lengden på kildestrengen (lengden er 18 inkludert nullkarakteren) slik at destinasjonen har plass til alle tegnene fra kildestreng.

#inkludere
#inkludere
int main ()

char source_str [] = "www.Linuxhint.com ";
char destination_str [30];
printf ("før du ringer strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("etter å ha utført strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
retur 0;

StrcPy () - CASE -1 (Eksempel2.c):

Intensjonen med dette eksempelprogrammet er å tydelig forklare hva som skjer når lengden på destinasjonsstrengen er mindre enn lengden på kildestrengen. I slike tilfeller vil ikke destinasjonsstedet ha nok mellomrom/byte til å imøtekomme alle tegnene (inkludert nullkarakter) fra kildestrengen. To ting, du bør alltid huske på:

  1. Strcpy () -funksjonen vil ikke sjekke om destinasjonen har nok plass.
  2. Dette kan være farlig i innebygd programvare fordi StrcPy () vil erstatte minneområdet utenfor destinasjonens grense.

La oss se på eksempelprogrammet. Vi har erklært Source_str og initialisert den til “www.Linuxhint.com ”, som vil ta 18 byte i minnet å lagre, inkludert nullkarakteren på slutten av strengen. Deretter har vi erklært en annen karakterprat i.e. destinasjon_str med størrelse på bare 5. Så destinasjon_str kan ikke holde kildestrengen med en total størrelse på 18 byte.

Men likevel kaller vi StrcPy () -funksjonen for å kopiere kildestrengen til destinasjonsstrengen. Fra utdataene nedenfor kan vi se at strcpy () ikke klaget i det hele tatt. I dette tilfellet vil StrcPy () -funksjonen begynne å kopiere tegnet fra kildestrengen (til den finner null -tegnet i kildestrengen) til destinasjonsadressen (selv om destinasjonsgrensen overstiger). Det betyr at StrcPy () -funksjonen ikke gjør noen grensekontroll for destinasjonsarray. Etter hvert vil StrcPy () -funksjonen overskrive minneadressene som ikke er tildelt destinasjonsarrayen. Dette er grunnen til at StrcPy () -funksjonen vil ende opp med å overskrive minneplasseringene som kan tildeles en annen variabel.

I dette eksemplet kan vi se fra utdataene nedenfor, at StrcPy () -funksjonen overskriver selve kildestrengen. Programmerere skal alltid være forsiktige med slik oppførsel.

#inkludere
#inkludere
int main ()

char source_str [] = "www.Linuxhint.com ";
char destination_str [5];
printf ("før du ringer strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("etter å ha utført strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
// printf ("Kildeadresse = %u (0x %x) \ n", & source_str [0], & source_str [0]);
// printf ("Destinasjonsadresse = %u (0x %x) \ n", & destinasjon_str [0], & destination_str [0]);
retur 0;

StrcPy () - Case -2 (Eksempel3.c):

Dette programmet illustrerer situasjonen når destinasjonsstrengstørrelsen er større enn kildestrengstørrelsen og destinasjonsstrengen allerede er initialisert med en viss verdi. I dette eksemplet har vi initialisert:

  • source_str til “www.Linuxhint.com ”[størrelse = 17+1 = 18]
  • destinasjon_str til “i_am_a_destination_string” [størrelse = 25+1 = 26]

StrcPy () -funksjonen vil kopiere alle de 17 tegnene og nulltegnet fra kildestrengen til destinasjonsstrengen. Men det vil ikke erstatte/endre de gjenværende byte (byte 19 til 26, en basert) i destinasjonsarrayen. Vi har brukt til at Loop skal iterere over destinasjonsarrayen og skrive ut hele matrisen for å bevise at byte-19 til 26 er uendret i destinasjonsarrayen. Derfor ser vi den siste utgangen som:

“Www.Linuxhint.com_string ”.

#inkludere
#inkludere
/* Dette programmet illustrerer situasjonen når:
Destinasjonsstrengstørrelse> Kilde strengstørrelse
og vi utfører strcpy () -funksjon for å kopiere
kildestreng til destinasjon.
Merk: Destinasjonsstrengstørrelsen skal alltid
være større enn eller lik kildestrengen.
*/
int main ()

char source_str [] = "www.Linuxhint.com ";
char destination_str [26] = "i_am_a_destination_string";
printf ("før du ringer strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("etter å ha utført strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
/* Skriv ut destinasjonsstreng ved hjelp av for loop*/
printf ("Skriv ut destinasjonsstrengen char av char: \ n \ n");
printf ("\ tdestination string =");
for (int i = 0; i<25;i++)

printf ("%c", destination_str [i]);

printf ("\ n \ n");
retur 0;

StrcPy () - Case -3 (Eksempel4.c):

Vi har vurdert dette programmet som et eksempel for å vise at vi aldri skal kalle strcpy () med en streng bokstavelig som destinasjonen. Dette vil forårsake udefinert oppførsel, og etter hvert vil programmet krasje.

#inkludere
#inkludere
int main ()

char source_str [] = "www.Linuxhint.com ";
printf ("før du ringer strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
/* Ring aldri strcpy () med streng bokstavelig som destinasjon.
Programmet vil krasje.
*/
strcpy ("destination_str", source_str);
printf ("etter å ha utført strcpy () funksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
retur 0;

StrcPy () - Brukerdefinert versjon (Eksempel5.c):

I dette eksempelprogrammet har vi vist hvordan vi skal skrive en brukerdefinert versjon av StrcPy () -funksjonen.

#inkludere
char * strcpy_user_defined (char * dest, const char * src);
/ * Brukerdefinert versjon av strcpy () -funksjon */
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
mens (*src != '\ 0') /* iterere til '\ 0' er funnet.*/

*dest = *src; / * Kopier kildekar til destinasjon */
SRC ++; / * Inkrement kildepeker */
dest ++; / * Inkrement Destination Pointer */

*dest = '\ 0'; /* Sett inn '\ 0' i destinasjon eksplisitt*/
return dest_backup;

int main ()

char source_str [] = "www.Linuxhint.com ";
char destination_str [30];
printf ("før du ringer brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
/ * RINGER BRUKERFEDERT STRING KOPI FUNKSJON */
strcpy_user_defined (destination_str, source_str);
printf ("Etter å ha utført brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
retur 0;

strcpy () - brukerdefinert versjon optimalisert (eksempel6.c):

Nå, i dette eksempelprogrammet, skal vi optimalisere den brukerdefinerte versjonen av Strcpy ().

#inkludere
char * strcpy_user_defined (char * dest, const char * src);
/ * Optimalisert versjon av brukerdefinert strcpy () -funksjon */
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
mens ( *dest ++ = *src ++)
;
return dest_backup;

int main ()

char source_str [] = "www.Linuxhint.com ";
char destination_str [30];
printf ("før du ringer brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
/ * RINGER BRUKERFEDERT STRING KOPI FUNKSJON */
strcpy_user_defined (destination_str, source_str);
printf ("Etter å ha utført brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tsource string = %s \ n", source_str);
printf ("\ tdestination string = %s \ n \ n", destination_str);
retur 0;

Konklusjon:

StrcPy () -funksjonen er en veldig populær og praktisk bibliotekfunksjon for å utføre strengkopieringsoperasjonen på C -programmeringsspråket. Dette brukes hovedsakelig til å kopiere strengen fra et sted til et annet sted. Imidlertid ønsker vi å gjenta det faktum at StrcPy () -funksjonen ikke gjør grensen og sjekker for destinasjonsarrayen, noe som kan føre til en seriøs programvarefeil hvis det blir ignorert. Det er alltid programmererens ansvar å sørge for at destinasjonsarray.