Hvordan bruke Strcpy () på C -språk?

How Use Strcpy C Language



I denne artikkelen skal vi lære om strcpy () -funksjonen i programmeringsspråket C. Strcpy () -funksjonen er en veldig populær standard biblioteksfunksjon for å utføre strengkopieringen i programmeringsspråket C. Det er flere standard overskriftsfiler i C -programmeringsspråk for å utføre standardoperasjoner. Strengen.h er en av slike topptekster, som gir flere standard bibliotekfunksjoner for å utføre strengoperasjoner. Strcpy () -funksjonen er en av bibliotekfunksjonene fra string.h.

Syntaks:

røye* strcpy (røye*destinasjons_plassering, konst røye*source_string);

Forstå strcpy ():

Det eneste formålet med strcpy () -funksjonen er å kopiere en streng fra kilde til destinasjon. La oss nå se på syntaksen ovenfor for strcpy () -funksjonen. Strcpy () -funksjonen er i stand til å godta 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 kopieringen er fullført fra kilde til destinasjon, returnerer strcpy () -funksjonen adressen til destinasjonen tilbake til den som ringer.



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



Strcpy () -funksjonen utfører heller ingen kontroller for å sikre at størrelsen på destinasjonen er mer enn kildestrengen, det er helt programmererens ansvar.





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

inthoved-()
{
røyesource_str[] = 'www.linuxhint.com';
røyedestinasjon_str[30];

printf ('Før du ringer strcpy () -funksjonen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

strcpy (destinasjon_str,source_str);

printf ('Etter å ha utført strcpy () -funksjonen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

komme tilbake 0;
}

strcpy ()-Case-1 (eksempel2.c):

Hensikten med dette eksempelprogrammet er å tydelig forklare hva som skjer når lengden på destinasjonsstrengen er mindre enn lengden på kildestrengen. I slike tilfeller vil destinasjonsplasseringen ikke ha nok mellomrom/byte til å ta imot alle tegnene (inkludert NULL -tegn) fra kildestrengen. To ting du alltid bør 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 det til www.linuxhint.com , som tar 18 byte i minnet å lagre, inkludert Null -tegnet på slutten av strengen. Deretter har vi deklarert en annen tegnmatrise, dvs. destination_str med størrelsen på bare 5. Så destinasjon_str kan ikke inneholde kildestrengen med en total størrelse på 18 byte.

Men likevel kaller vi strcpy () -funksjonen for å kopiere kildestrengen til destinasjonsstrengen. Fra utgangen nedenfor kan vi se strcpy () ikke klaget i det hele tatt. I dette tilfellet vil strcpy () -funksjonen begynne å kopiere tegnet fra kildestrengen (til det finner NULL -tegnet i kildestrengen) til destinasjonsadressen (selv om destinasjonsgrensen overskrider). Det betyr at strcpy () -funksjonen ikke utfører noen grensekontroll for destinasjonsmatrise. Etterhvert vil strcpy () -funksjonen overskrive minneadressene som ikke er tilordnet målmatrisen. Det er derfor strcpy () -funksjonen vil ende opp med å overskrive minneplasseringene som kan tildeles en annen variabel.

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

#inkludere
#inkludere

inthoved-()
{
røyesource_str[] = 'www.linuxhint.com';
røyedestinasjon_str[5];

printf ('Før du ringer strcpy () -funksjonen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

strcpy (destinasjon_str,source_str);

printf ('Etter å ha utført strcpy () -funksjonen: n n');
printf (' tKildestreng = %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]);

komme tilbake 0;
}

strcpy ()-Case-2 (eksempel3.c):

Dette programmet illustrerer situasjonen når størrelsen på destinasjonsstrengen er større enn størrelsen på kildestrengen 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 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 arrayet for å bevise at bytes-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ålstrengstørrelse> kildestrengstørrelse

og vi utfører strcpy () -funksjonen for å kopiere
kildestreng til destinasjon.

Merk: Størrelsen på destinasjonsstrengen bør alltid
være større enn eller lik kildestrengen.
* /

inthoved-()
{
røyesource_str[] = 'www.linuxhint.com';
røyedestinasjon_str[26] = 'I_AM_A_DESTINATION_STRING';

printf ('Før du ringer strcpy () -funksjonen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

strcpy (destinasjon_str,source_str);

printf ('Etter å ha utført strcpy () -funksjonen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);


/* skriv ut destinasjonsstreng med sløyfe*/
printf ('Skriv ut destinasjonsstrengen char by char: n n');
printf (' tDestinasjonsstreng = ');

til(intJeg=0;Jeg<25;Jeg++)
{
printf ('% c',destinasjon_str[Jeg]);
}
printf (' n n');

komme tilbake 0;
}

strcpy ()-Case-3 (eksempel4.c):

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

#inkludere
#inkludere

inthoved-()
{
røyesource_str[] = 'www.linuxhint.com';

printf ('Før du ringer strcpy () -funksjonen: n n');
printf (' tKildestreng = %s n',source_str);

/* Ring aldri strcpy () med strengen bokstavelig som destinasjon.
Programmet vil krasje.
* /

strcpy ('destination_str',source_str);

printf ('Etter å ha utført strcpy () -funksjonen: n n');
printf (' tKildestreng = %s n',source_str);

komme tilbake 0;
}

strcpy () - Brukerdefinert versjon (eksempel5.c):

I dette eksempelprogrammet har vi vist hvordan du skriver en brukerdefinert versjon av strcpy () -funksjonen.

#inkludere
røye *strcpy_user_defined(røye *dest, konst røye *src);

/ * Brukerdefinert versjon av strcpy () -funksjonen */
røye *strcpy_user_defined(røye *dest, konst røye *src)
{
røye *dest_backup=dest;

samtidig som(*src! = ' 0') /* Iterate til ' 0' er funnet.*/
{
*dest= *src; / * Kopier kildeskriver til destinasjon */
src++; / * Økende kildepeker */
dest++; / * Øk destinasjonspekeren */
}

*dest= ' 0'; /* Sett eksplisitt inn ' 0' i destinasjonen*/

komme tilbakedest_backup;
}

inthoved-()
{
røyesource_str[] = 'www.linuxhint.com';
røyedestinasjon_str[30];

printf ('Før du ringer til brukerdefinert strengkopi -funksjon: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

/ * Ringer brukerdefinert strengkopifunksjon */
strcpy_user_defined(destinasjon_str,source_str);

printf ('Etter å ha utført brukerdefinert strengkopi -funksjon: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

komme tilbake 0;
}

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

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

#inkludere
røye *strcpy_user_defined(røye *dest, konst røye *src);


/ * Optimalisert versjon av brukerdefinert strcpy () -funksjon */
røye *strcpy_user_defined(røye *dest, konst røye *src)
{
røye *dest_backup=dest;

samtidig som(*dest++ = *src++)
;

komme tilbakedest_backup;
}

inthoved-()
{
røyesource_str[] = 'www.linuxhint.com';
røyedestinasjon_str[30];

printf ('Før du ringer til brukerdefinert strengkopi -funksjon: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

/ * Ringer brukerdefinert strengkopieringsfunksjon */
strcpy_user_defined(destinasjon_str,source_str);

printf ('Etter å ha utført brukerdefinert strengkopi -funksjon: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinasjonsstreng = %s n n',destinasjon_str);

komme tilbake 0;
}

Konklusjon :

Strcpy () -funksjonen er en veldig populær og praktisk bibliotekfunksjon for å utføre strengkopieringen i programmeringsspråket C. Dette brukes hovedsakelig til å kopiere strengen fra ett sted til et annet sted. Vi vil imidlertid gjenta det faktum at strcpy () -funksjonen ikke gjør grensekontrollen for destinasjonsmatrisen, noe som kan føre til en alvorlig programvarefeil hvis den ignoreres. Det er alltid programmererens ansvar å sørge for at destinasjonsmatrisen har nok plass til å holde alle tegnene fra kildestrengen inkludert NULL -tegnet.