C Programmering

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

Sådan bruges Strcpy () på C-sprog?
I denne artikel vil vi lære om strcpy () -funktionen i C-programmeringssproget. Strcpy () -funktionen er en meget populær standardbiblioteksfunktion til at udføre strengekopiering i C-programmeringssproget. Der er flere standard headerfiler på programmeringssprog C for at udføre standardhandlinger. “Strengen.h ”er en af ​​sådanne headerfiler, der giver flere standardbiblioteksfunktioner til at udføre strengoperationer. Funktionen "strcpy ()" er en af ​​biblioteksfunktionerne, der leveres af "streng.h ”.

Syntaks:

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

Forståelse 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 strcpy () -funktionen. Funktionen strcpy () kan acceptere to parametre -

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

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

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

Eksempler:

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

  1. strcpy () - Normal drift (eksempel1.c)
  2. strcpy () - Sag-1 (eksempel2.c)
  3. strcpy () - Sag-2 (eksempel3.c)
  4. strcpy () - Case-3 (eksempel4.c)
  5. strcpy () - Brugerdefineret version (eksempel5.c)
  6. strcpy () - Brugerdefineret version optimeret (eksempel 6.c)

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

Dette eksempelprogram viser, hvordan man udfører en normal strengkopiering ved hjælp af strcpy () -funktionen i C-programmeringssproget. Vær opmærksom på, at længden af ​​destinationsstrengen 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 tegn fra kildestreng.

#omfatte
#omfatte
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Før du ringer til strcpy () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, kilde_str);
printf ("Efter udførelse af strcpy () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
returnere 0;

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

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

  1. Funktionen strcpy () kontrollerer ikke, om destinationen har plads nok.
  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 det tager 18 bytes i hukommelsen at gemme, inklusive Null-tegnet i slutningen af ​​strengen. Derefter har vi erklæret et andet tegnarray i.e. destination_str med størrelsen kun 5. Så destination_str kan ikke indeholde kildestrengen med en samlet størrelse på 18 byte.

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 strcpy () -funktionen at kopiere tegnet fra kildestrengen (indtil den finder NULL-tegnet i kildestrengen) til destinationsadressen (selvom destinationsgrænsen overstiger). Det betyder, at strcpy () -funktionen ikke foretager nogen grænsekontrol for destinationsarray. Til sidst overskriver strcpy () -funktionen de hukommelsesadresser, der ikke er allokeret til destinationsarrayet. Dette er grunden til, at strcpy () -funktionen ender med at overskrive hukommelsesplaceringerne, som muligvis er allokeret til en anden variabel.

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

#omfatte
#omfatte
int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [5];
printf ("Før du ringer til strcpy () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, kilde_str);
printf ("Efter udførelse af strcpy () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
// printf ("Source Address =% u (0x% x) \ n", & source_str [0], & source_str [0]);
// printf ("Destinationsadresse =% u (0x% x) \ n", & destination_str [0] og destination_str [0]);
returnere 0;

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

Dette program illustrerer situationen, hvor destinationsstrengens størrelse er større end kildestrengsstø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]

Funktionen strcpy () 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 destinationsarrayet. Vi har brugt for loop til at gentage over destinationsarrayet og udskrive hele arrayet for at bevise, at bytes-19 til 26 er uændrede i destinationsarrayet. Derfor ser vi den sidste output som:

“Www.linuxhint.com_STRING ”.

#omfatte
#omfatte
/ * Dette program illustrerer situationen, når:
destinationsstrengsstørrelse> kildestrengsstørrelse
og vi udfører strcpy () -funktionen for at kopiere
kildestreng til destination.
Bemærk: Målstrengens størrelse skal altid være
være større end eller lig med 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 () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, kilde_str);
printf ("Efter udførelse af strcpy () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * udskriv destinationsstreng ved hjælp af for loop * /
printf ("Udskriv destinationsstrengen char efter char: \ n \ n");
printf ("\ tDestination String =");
for (int i = 0; i<25;i++)

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

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

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

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

#omfatte
#omfatte
int main ()

char source_str [] = "www.linuxhint.com ";
printf ("Før du ringer til strcpy () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
/ * Ring aldrig til strcpy () med streng bogstavelig som destination.
Programmet går ned.
* /
strcpy ("destination_str", source_str);
printf ("Efter udførelse af strcpy () -funktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
returnere 0;

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

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

#omfatte
char * strcpy_user_defined (char * dest, const char * src);
/ * Brugerdefineret version af strcpy () -funktion * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
mens (* src != '\ 0') / * Iterér indtil '\ 0' er fundet.* /

* dest = * src; / * Kopier kildetegn til destination * /
src ++; / * Forøg kildemarkør * /
dest ++; / * Forøg destinationsmarkør * /

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

int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Før du ringer til brugerdefineret strengkopiering: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Opkald til brugerdefineret strengkopieringsfunktion * /
strcpy_user_defined (destination_str, kilde_str);
printf ("Efter udførelse af brugerdefineret streng kopifunktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
returnere 0;

strcpy () - Brugerdefineret version optimeret (eksempel 6.c):

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

#omfatte
char * strcpy_user_defined (char * dest, const char * src);
/ * Optimeret version af brugerdefineret strcpy () -funktion * /
char * strcpy_user_defined (char * dest, const char * src)

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

int main ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Inden du ringer til brugerdefineret streng kopifunktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Opkald til brugerdefineret strengkopieringsfunktion * /
strcpy_user_defined (destination_str, kilde_str);
printf ("Efter udførelse af brugerdefineret strengkopiefunktion: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
returnere 0;

Konklusion:

Strcpy () -funktionen er en meget populær og praktisk biblioteksfunktion til at udføre strengekopiering 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ænsekontrol af destinationsarrayet, hvilket kan føre til en alvorlig softwarefejl, hvis den ignoreres. Det er altid programmørens ansvar at sikre, at destinationsarrayet har plads nok til at indeholde alle tegn fra kildestreng inklusive NULL-tegnet.

Bedste apps til Gamepad Mapping til Linux
Hvis du kan lide at spille spil på Linux med en gamepad i stedet for et typisk tastatur- og musesystem, er der nogle nyttige apps til dig. Mange pc-sp...
Nyttige værktøjer til Linux-spillere
Hvis du kan lide at spille spil på Linux, er chancerne for, at du måske har brugt apps og hjælpeprogrammer som Wine, Lutris og OBS Studio for at forbe...
HD Remastered-spil til Linux, der aldrig tidligere havde haft en Linux-udgivelse
Mange spiludviklere og udgivere kommer med HD-remaster af gamle spil for at forlænge franchisens levetid. Venligst fans, der anmoder om kompatibilitet...