Sådan bruges Strcpy () på C -sprog?

How Use Strcpy C Language



I denne artikel skal vi lære om strcpy () -funktionen i programmeringssproget C. Strcpy () -funktionen er en meget populær standardbiblioteksfunktion til at udføre strengkopiering i C -programmeringssproget. Der er flere standard header -filer i C -programmeringssprog til at udføre standardoperationer. String.h er en af ​​sådanne header -filer, som giver flere standardbibliotekfunktioner til at udføre strengoperationer. Strcpy () -funktionen er en af ​​biblioteksfunktionerne fra string.h.

Syntaks:

forkælelse* strcpy (forkælelse*destination_location, konst forkælelse*kilde_streng);

Forstå strcpy ():

Det eneste formål med funktionen strcpy () er at kopiere en streng fra kilde til destination. Lad os nu se på ovenstående syntaks for funktionen strcpy (). Strcpy () -funktionen er i stand til at acceptere to parametre -







  • char * destination
  • const char * kilde

Kilden er en konstant her for at sikre, at funktionen strcpy () ikke kan ændre kildestrengen. Strcpy () -funktionen kopierer alle tegnene (inklusive NULL -tegnet i slutningen af ​​strengen) fra kildestrengen til destinationen. Når kopieringen er udført fra kilde til destination, returnerer funktionen strcpy () adressen til destinationen tilbage til opkaldsfunktionen.



Det vigtige punkt at bemærke her er, at funktionen strcpy () ikke tilføjer kildestrengen med destinationsstrengen. Det erstatter snarere destinationens indhold med kildestrengens indhold.



Strcpy () -funktionen udfører heller ikke nogen kontroller for at sikre, at destinationens størrelse er mere end kildestrengen, det er helt programmørens ansvar.





Eksempler:

Nu vil vi se flere eksempler for at forstå strcpy () -funktionen:

  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 () - Brugerdefineret version (eksempel5.c)
  6. strcpy () - Brugerdefineret version optimeret (eksempel6.c)

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

Dette eksempelprogram viser, hvordan man udfører en normal strengkopiering ved hjælp af funktionen strcpy () i programmeringssproget C. Bemærk, at destinationsstrengens længde er 30 (char destination_str [30];), hvilket er større end længden af ​​kildestrengen (længden er 18 inklusive NULL -tegnet), så destinationen kan rumme alle tegnene fra kilde streng.



#omfatte
#omfatte

intvigtigste()
{
forkælelsesource_str[] = 'www.linuxhint.com';
forkælelsedestination_str[30];

printf ('Inden du kalder strcpy () -funktionen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

strcpy (destination_str,source_str);

printf ('Efter udførelse af strcpy () funktion: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

Vend tilbage 0;
}

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

Hensigten med dette eksempelprogram er klart at forklare, hvad der sker, når længden af ​​destinationsstrengen er mindre end længden af ​​kildestrengen. I sådanne tilfælde har destinationsplaceringen ikke nok mellemrum/bytes til at rumme alle tegnene (inklusive NULL -tegn) fra kildestrengen. To ting, du altid skal huske på:

  1. Strcpy () -funktionen kontrollerer ikke, om destinationen har tilstrækkelig plads.
  2. Dette kan være farligt i integreret software, fordi strcpy () erstatter hukommelsesområdet ud over destinationsgrænsen.

Lad os se på eksempelprogrammet. Vi har erklæret source_str og initialiseret det til www.linuxhint.com , som tager 18 bytes i hukommelsen at gemme, inklusive Null -tegnet i slutningen af ​​strengen. Derefter har vi erklæret en anden karaktermatrix, dvs. destination_str med størrelsen kun 5. Så destination_str kan ikke indeholde kildestrengen med en samlet størrelse på 18 bytes.

Men stadig kalder vi strcpy () -funktionen for at kopiere kildestrengen til destinationsstrengen. Fra nedenstående output kan vi se, at strcpy () slet ikke klagede. I dette tilfælde begynder funktionen strcpy () at kopiere tegnet fra kildestrengen (indtil det finder NULL -tegnet i kildestrengen) til destinationsadressen (selvom destinationsgrænsen overskrider). Det betyder, at strcpy () -funktionen ikke foretager nogen grænsekontrol for destinationsmatrix. Til sidst vil funktionen strcpy () overskrive de hukommelsesadresser, der ikke er tildelt destinationsmatrixen. Dette er grunden til, at strcpy () -funktionen ender med at overskrive de hukommelsesplaceringer, der kan tildeles en anden variabel.

I dette eksempel kan vi se fra nedenstående output, at funktionen strcpy () overskriver selve kildestrengen. Programmerere bør altid være forsigtige med sådan adfærd.

#omfatte
#omfatte

intvigtigste()
{
forkælelsesource_str[] = 'www.linuxhint.com';
forkælelsedestination_str[5];

printf ('Inden du kalder strcpy () -funktionen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

strcpy (destination_str,source_str);

printf ('Efter udførelse af strcpy () funktion: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

// printf ('Kildeadresse = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('Destinationsadresse = %u (0x %x) n', & destination_str [0] og destination_str [0]);

Vend tilbage 0;
}

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

Dette program illustrerer situationen, når destinationsstrengstørrelsen er større end kildestrengstørrelsen, og destinationsstrengen allerede er initialiseret med en vis værdi. I dette eksempel har vi initialiseret:

  • source_str til www.linuxhint.com [størrelse = 17+1 = 18]
  • destination_str til I_AM_A_DESTINATION_STRING [størrelse = 25+1 = 26]

Strcpy () -funktionen kopierer alle de 17 tegn og NULL -tegnet fra kildestrengen til destinationsstrengen. Men det vil ikke erstatte/ændre de resterende bytes (Byte 19 til 26, en baseret) i destinationsmatrixen. Vi har brugt for loop til at iterere over destinations arrayet og udskrive hele arrayet for at bevise, at bytes-19 til 26 er uændrede i destinations arrayet. Derfor ser vi det sidste output som:

www.linuxhint.com_STRING .

#omfatte
#omfatte


/* Dette program illustrerer situationen, når:

destinationsstrengstørrelse> kildestrengstørrelse

og vi udfører strcpy () -funktionen for at kopiere
kildestreng til destination.

Bemærk: Størrelsen på destinationsstrengen skal altid
være større end eller lig med kildestrengen.
* /

intvigtigste()
{
forkælelsesource_str[] = 'www.linuxhint.com';
forkælelsedestination_str[26] = 'I_AM_A_DESTINATION_STRING';

printf ('Inden du kalder strcpy () -funktionen: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

strcpy (destination_str,source_str);

printf ('Efter udførelse af strcpy () funktion: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);


/* udskriv destinationsstreng ved hjælp af loop*/
printf ('Udskriv destinationsstrengen char for char: n n');
printf (' tDestinationsstreng = ');

til(intjeg=0;jeg<25;jeg++)
{
printf ('% c',destination_str[jeg]);
}
printf (' n n');

Vend tilbage 0;
}

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

Vi har betragtet dette program som et eksempel for at vise, at vi aldrig skulle kalde strcpy () med en streng bogstavelig som destination. Dette vil forårsage en udefineret adfærd, og i sidste ende vil programmet gå ned.

#omfatte
#omfatte

intvigtigste()
{
forkælelsesource_str[] = 'www.linuxhint.com';

printf ('Inden du kalder strcpy () -funktionen: n n');
printf (' tKildestreng = %s n',source_str);

/* Ring aldrig til strcpy () med string letteral som destination.
Programmet vil gå ned.
* /

strcpy ('destination_str',source_str);

printf ('Efter udførelse af strcpy () funktion: n n');
printf (' tKildestreng = %s n',source_str);

Vend tilbage 0;
}

strcpy () - Brugerdefineret version (eksempel5.c):

I dette eksempelprogram har vi vist, hvordan man skriver en brugerdefineret version af strcpy () -funktionen.

#omfatte
forkælelse *strcpy_user_defined(forkælelse *dest, konst forkælelse *src);

/ * Brugerdefineret version af funktionen strcpy () */
forkælelse *strcpy_user_defined(forkælelse *dest, konst forkælelse *src)
{
forkælelse *dest_backup=dest;

mens(*src! = ' 0') /* Iterér, indtil ' 0' er fundet.*/
{
*dest= *src; / * Kopiér kilde -char til destination */
src++; / * Forøgelse af kildepeger */
dest++; / * Forøgelse af destinationsmarkør */
}

*dest= ' 0'; /* Indsæt eksplicit ' 0' i destinationen*/

Vend tilbagedest_backup;
}

intvigtigste()
{
forkælelsesource_str[] = 'www.linuxhint.com';
forkælelsedestination_str[30];

printf ('Inden du ringer til brugerdefineret strengkopieringsfunktion: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

/ * Opkald til brugerdefineret strengkopieringsfunktion */
strcpy_user_defined(destination_str,source_str);

printf ('Efter udførelse af brugerdefineret strengkopieringsfunktion: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

Vend tilbage 0;
}

strcpy () - Brugerdefineret version optimeret (eksempel6.c):

Nu, i dette eksempelprogram, skal vi optimere den brugerdefinerede version af strcpy ().

#omfatte
forkælelse *strcpy_user_defined(forkælelse *dest, konst forkælelse *src);


/ * Optimeret version af brugerdefineret strcpy () -funktion */
forkælelse *strcpy_user_defined(forkælelse *dest, konst forkælelse *src)
{
forkælelse *dest_backup=dest;

mens(*dest++ = *src++)
;

Vend tilbagedest_backup;
}

intvigtigste()
{
forkælelsesource_str[] = 'www.linuxhint.com';
forkælelsedestination_str[30];

printf ('Inden du ringer til brugerdefineret strengkopieringsfunktion: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

/ * Opkald til brugerdefineret strengkopieringsfunktion */
strcpy_user_defined(destination_str,source_str);

printf ('Efter udførelse af brugerdefineret strengkopieringsfunktion: n n');
printf (' tKildestreng = %s n',source_str);
printf (' tDestinationsstreng = %s n n',destination_str);

Vend tilbage 0;
}

Konklusion :

Strcpy () -funktionen er en meget populær og praktisk biblioteksfunktion til at udføre strengkopiering i C -programmeringssproget. Dette bruges hovedsageligt til at kopiere strengen fra et sted til et andet sted. Vi vil dog gentage det faktum, at strcpy () -funktionen ikke foretager grænsekontrollen for destinationsmatrixen, hvilket kan føre til en alvorlig softwarefejl, hvis den ignoreres. Det er altid programmørens ansvar at sørge for, at destinationsarrayet har plads nok til at holde alle tegnene fra kildestrengen inklusive NULL -tegnet.