Syntaks:
char * strcpy (char * destination_location, const char * source_string);Forstå strcpy ():
Det eneste formålet med funksjonen strcpy () er å kopiere en streng fra kilde til destinasjon. La oss nå se på ovennevnte syntaks for strcpy () -funksjonen. Strcpy () -funksjonen kan akseptere to parametere -
- røye * destinasjon
- const char * kilde
Kilden er en konstant her for å sikre at funksjonen strcpy () ikke kan endre kildestrengen. Strcpy () -funksjonen kopierer alle tegnene (inkludert NULL-tegnet på slutten av strengen) fra kildestrengen til destinasjonen. Når kopieringen er fullført fra kilde til destinasjon, returnerer strcpy () -funksjonen adressen til destinasjonen tilbake til anropsfunksjonen.
Det viktige punktet å legge merke til her er at funksjonen strcpy () ikke legger til kildestrengen med destinasjonsstrengen. Det erstatter heller innholdet på destinasjonen med innholdet i kildestrengen.
Også, strcpy () -funksjonen utfører ingen kontroller for å sikre at størrelsen på destinasjonen er mer enn kildestrengen, det er helt ansvaret for programmereren.
Eksempler:
Nå vil vi se flere eksempler for å forstå funksjonen strcpy ():
- strcpy () - Normal bruk (eksempel1.c)
- strcpy () - Sak-1 (eksempel2.c)
- strcpy () - Sak-2 (eksempel3.c)
- strcpy () - Sak-3 (eksempel4.c)
- strcpy () - Brukerdefinert versjon (eksempel5.c)
- strcpy () - Brukerdefinert versjon optimalisert (eksempel 6.c)
strcpy () - Normal drift (eksempel1.c):
Dette eksempelprogrammet viser hvordan du utfører en normal strengkopiering ved hjelp av strcpy () -funksjonen i programmeringsspråket C. 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 NULL-tegnet), slik at destinasjonen kan ta imot alle tegnene fra kildestreng.
#inkludere#inkludere
int main ()
char source_str [] = "www.linuxhint.com ";
røye destinasjon_str [30];
printf ("Før du ringer til strcpy () -funksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
strcpy (destinasjon_str, kilde_str);
printf ("Etter kjøring av strcpy () -funksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
retur 0;
strcpy () - Sak-1 (eksempel2.c):
Hensikten med dette eksempelprogrammet er å tydelig forklare hva som skjer når destinasjonsstrengens lengde er mindre enn kildestrengens lengde. I slike tilfeller vil destinasjonsplasseringen ikke ha nok mellomrom / byte til å imøtekomme alle tegnene (inkludert NULL-tegn) fra kildestrengen. To ting, bør du alltid huske på:
- Strcpy () -funksjonen vil ikke sjekke om destinasjonen har nok plass.
- 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 tar 18 byte i minnet å lagre, inkludert Null-tegnet på slutten av strengen. Deretter har vi erklært et annet tegnarrangement i.e. destinasjon_str med størrelsen på bare 5. Så mål_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 begynner strcpy () -funksjonen å kopiere tegnet fra kildestrengen (til den finner NULL-tegnet i kildestrengen) til destinasjonsadressen (selv om destinasjonsgrensen overskrider). Det betyr at strcpy () -funksjonen ikke gjør noen grensekontroll for destinasjonsmatrisen. Til slutt vil strcpy () -funksjonen overskrive minneadressene som ikke er tildelt destinasjonsmatrisen. Dette er grunnen til at strcpy () -funksjonen ender med å overskrive minneplasseringene som kan være allokert til en annen variabel.
I dette eksemplet kan vi se fra utdataene nedenfor at funksjonen strcpy () overskriver selve kildestrengen. Programmører bør alltid være forsiktige med slik oppførsel.
#inkludere#inkludere
int main ()
char source_str [] = "www.linuxhint.com ";
char destinasjon_str [5];
printf ("Før du ringer til strcpy () -funksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
strcpy (destinasjon_str, kilde_str);
printf ("Etter kjøring av strcpy () -funksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
// printf ("Source Address =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Destinasjonsadresse =% u (0x% x) \ n", & destinasjonsstr [0], og destinasjonsstr [0]);
retur 0;
strcpy () - Sak-2 (eksempel3.c):
Dette programmet illustrerer situasjonen når målstrengstø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” [size = 25 + 1 = 26]
Strcpy () -funksjonen kopierer alle de 17 tegnene og NULL-tegnet fra kildestrengen til destinasjonsstrengen. Men det vil ikke erstatte / endre de gjenværende byte (Byte 19 til 26, en basert) i destinasjonsmatrisen. Vi har brukt for loop for å iterere over destinasjonsmatrisen og skrive ut hele matrisen for å bevise at byte-19 til 26 er uendret i destinasjonsmatrisen. Derfor ser vi den siste utgangen som:
“Www.linuxhint.com_STRING ”.
#inkludere#inkludere
/ * Dette programmet illustrerer situasjonen når:
målstrengsstørrelse> kildestrengsstørrelse
og vi utfører funksjonen strcpy () for å kopiere
kildestreng til destinasjon.
Merk: Målstrengstørrelsen skal alltid være
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 til strcpy () -funksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
strcpy (destinasjon_str, kilde_str);
printf ("Etter kjøring av strcpy () -funksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
/ * skriv destinasjonsstreng ved hjelp av for loop * /
printf ("Skriv ut destinasjonsstrengen char etter char: \ n \ n");
printf ("\ tDestination String =");
for (int i = 0; i<25;i++)
printf ("% c", destinasjon_str [i]);
printf ("\ n \ n");
retur 0;
strcpy () - Sak-3 (eksempel4.c):
Vi har sett på dette programmet som et eksempel for å vise at vi aldri skal kalle strcpy () med en streng som bokstav. Dette vil føre til udefinert oppførsel, og til slutt vil programmet krasje.
#inkludere#inkludere
int main ()
char source_str [] = "www.linuxhint.com ";
printf ("Før du ringer til strcpy () -funksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
/ * Ring aldri strcpy () med streng bokstavelig som destinasjon.
Programmet vil krasje.
* /
strcpy ("destinasjon_str", kilde_str);
printf ("Etter kjøring av 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 du skriver en brukerdefinert versjon av strcpy () -funksjonen.
#inkluderechar * strcpy_user_defined (char * dest, const char * src);
/ * Brukerdefinert versjon av strcpy () -funksjonen * /
char * strcpy_user_defined (char * dest, con char char * src)
char * dest_backup = dest;
mens (* src != '\ 0') / * Iterer til '\ 0' er funnet.* /
* dest = * src; / * Kopier kildetegn til destinasjon * /
src ++; / * Øk kildepekeren * /
dest ++; / * Øk destinasjonspeker * /
* dest = '\ 0'; / * Sett inn '\ 0' i destinasjonen eksplisitt * /
return dest_backup;
int main ()
char source_str [] = "www.linuxhint.com ";
røye destinasjon_str [30];
printf ("Før du ringer til brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
/ * Ringer brukerdefinert strengkopieringsfunksjon * /
strcpy_user_defined (destinasjon_str, kilde_str);
printf ("Etter kjøring av brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
retur 0;
strcpy () - Brukerdefinert versjon optimalisert (eksempel 6.c):
Nå, i dette eksempelprogrammet, skal vi optimalisere den brukerdefinerte versjonen av strcpy ().
#inkluderechar * strcpy_user_defined (char * dest, const char * src);
/ * Optimalisert versjon av brukerdefinert strcpy () -funksjon * /
char * strcpy_user_defined (char * dest, con char char * src)
char * dest_backup = dest;
mens (* dest ++ = * src ++)
;
return dest_backup;
int main ()
char source_str [] = "www.linuxhint.com ";
røye destinasjon_str [30];
printf ("Før du ringer til brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
/ * Ringer brukerdefinert strengkopieringsfunksjon * /
strcpy_user_defined (destinasjon_str, kilde_str);
printf ("Etter å ha utført brukerdefinert strengkopifunksjon: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestinasjonsstreng =% s \ n \ n", destinasjon_str);
retur 0;
Konklusjon:
Strcpy () -funksjonen er en veldig populær og hendig biblioteksfunksjon for å utføre strengekopiering i C-programmeringsspråket. Dette brukes hovedsakelig til å kopiere strengen fra ett sted til et annet sted. Vi ønsker imidlertid å gjenta det faktum at strcpy () -funksjonen ikke utfører grensekontroll for destinasjonsmatrisen, noe som kan føre til en alvorlig programvarefeil hvis den ignoreres. Det er alltid ansvaret til programmereren å sørge for at destinasjonsmatrisen har nok plass til å holde alle tegnene fra kildestrengen inkludert NULL-tegnet.