C Programmeren

Hoe Strcpy() in C-taal te gebruiken?

Hoe Strcpy() in C-taal te gebruiken?
In dit artikel gaan we meer te weten komen over de functie strcpy() in de programmeertaal C C. De functie strcpy() is een zeer populaire standaardbibliotheekfunctie om de bewerking voor het kopiëren van tekenreeksen in de programmeertaal C uit te voeren. Er zijn verschillende standaard header-bestanden in de programmeertaal C om standaardbewerkingen uit te voeren. De snaar.h" is een van dergelijke header-bestanden, die verschillende standaardbibliotheekfuncties biedt om stringbewerkingen uit te voeren. De functie "strcpy()" is een van de bibliotheekfuncties die wordt geboden door "string.h”.

Syntaxis:

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

Inzicht in strcpy():

Het enige doel van de strcpy()-functie is om een ​​string van de bron naar de bestemming te kopiëren. Laten we nu eens kijken naar de bovenstaande syntaxis van de functie strcpy()). De functie strcpy() kan twee parameters accepteren: -

De bron is hier een constante om ervoor te zorgen dat de functie strcpy() de brontekenreeks niet kan wijzigen. De functie strcpy() kopieert alle tekens (inclusief het NULL-teken aan het einde van de tekenreeks) van de brontekenreeks naar de bestemming. Zodra de kopieerbewerking van bron naar bestemming is voltooid, retourneert de functie strcpy() het adres van de bestemming terug naar de aanroepfunctie.

Het belangrijke punt om op te merken is dat de functie strcpy() de brontekenreeks niet toevoegt aan de bestemmingsreeks. Het vervangt eerder de inhoud van de bestemming door de inhoud van de bronstring.

Ook voert de functie strcpy() geen controles uit om ervoor te zorgen dat de grootte van de bestemming groter is dan de brontekenreeks, het is volledig de verantwoordelijkheid van de programmeur.

Voorbeelden:

Nu zullen we verschillende voorbeelden zien om de strcpy()-functie te begrijpen:

  1. strcpy() - Normale werking (voorbeeld1.c)
  2. strcpy() - Case-1 (voorbeeld2.c)
  3. strcpy() - Case-2 (voorbeeld3.c)
  4. strcpy() - Case-3 (voorbeeld4.c)
  5. strcpy() - Door de gebruiker gedefinieerde versie (voorbeeld5.c)
  6. strcpy() - Door de gebruiker gedefinieerde versie geoptimaliseerd (voorbeeld6.c)

strcpy() - Normale werking (voorbeeld1.c):

Dit voorbeeldprogramma laat zien hoe u een normale tekenreekskopieerbewerking uitvoert met de functie strcpy() in de programmeertaal C. Houd er rekening mee dat de lengte van de doelreeks 30 is (char destination_str[30]; ), wat groter is dan de lengte van de bronreeks (lengte is 18 inclusief het NULL-teken), zodat de bestemming alle tekens van de brontekenreeks.

#include
#include
int hoofd()

char source_str[] = "www.linuxhint.com";
char bestemming_str[30];
printf("Voordat strcpy() functie wordt aangeroepen: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
strcpy(destination_str, source_str);
printf("Na het uitvoeren van de strcpy() functie: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
retourneer 0;

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

De bedoeling van dit voorbeeldprogramma is om duidelijk uit te leggen wat er gebeurt als de lengte van de doelreeks kleiner is dan de lengte van de bronreeks. In dergelijke gevallen heeft de bestemmingslocatie niet genoeg spaties/bytes om alle tekens (inclusief NULL-tekens) van de brontekenreeks op te nemen. Twee dingen die u altijd in gedachten moet houden:

  1. De functie strcpy() controleert niet of de bestemming voldoende ruimte heeft.
  2. Dit kan gevaarlijk zijn in embedded software omdat de strcpy() het geheugengebied buiten de grens van de bestemming zal vervangen.

Laten we eens kijken naar het voorbeeldprogramma. We hebben source_str gedeclareerd en geïnitialiseerd naar “www.linuxhint.com", wat 18 bytes in het geheugen in beslag neemt om op te slaan, inclusief het Null-teken aan het einde van de string. Vervolgens hebben we een andere tekenreeks i . gedeclareerd.e. bestemming_str met de grootte van slechts 5. Dus de destination_str kan de source string niet bevatten met een totale grootte van 18 bytes.

Maar toch roepen we de functie strcpy() aan om de bronreeks naar de bestemmingsreeks te kopiëren. Uit de onderstaande uitvoer kunnen we zien dat de strcpy() helemaal niet klaagde. In dit geval zal de strcpy()-functie beginnen met het kopiëren van het teken uit de brontekenreeks (totdat het het NULL-teken in de brontekenreeks vindt) naar het bestemmingsadres (ook al overschrijdt de bestemmingsgrens). Dat betekent dat de functie strcpy() geen grenscontroles uitvoert voor de bestemmingsarray. Uiteindelijk zal de functie strcpy() de geheugenadressen overschrijven die niet zijn toegewezen aan de doelarray. Dit is de reden waarom de functie strcpy() uiteindelijk de geheugenlocaties overschrijft die aan een andere variabele kunnen zijn toegewezen.

In dit voorbeeld kunnen we aan de onderstaande uitvoer zien dat de functie strcpy() de bronreeks zelf overschrijft. Programmeurs moeten altijd voorzichtig zijn met dergelijk gedrag.

#include
#include
int hoofd()

char source_str[] = "www.linuxhint.com";
char bestemming_str[5];
printf("Voordat strcpy() functie wordt aangeroepen: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
strcpy(destination_str, source_str);
printf("Na het uitvoeren van de strcpy() functie: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
//printf("Bronadres = %u (0x%x)\n", &source_str[0], &source_str[0]);
//printf("Bestemmingsadres = %u (0x%x)\n", &destination_str[0], &destination_str[0]);
retourneer 0;

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

Dit programma illustreert de situatie wanneer de grootte van de doelreeks groter is dan de grootte van de bronreeks en de doelreeks al is geïnitialiseerd met een bepaalde waarde. In dit voorbeeld hebben we geïnitialiseerd:

  • source_str naar “www.linuxhint.com” [maat = 17+1 = 18]
  • bestemming_str naar "I_AM_A_DESTINATION_STRING" [maat = 25+1 = 26]

De functie strcpy() kopieert alle 17 tekens en het NULL-teken van de brontekenreeks naar de doelreeks. Maar het zal de resterende bytes (Byte 19 tot 26, één gebaseerd) in de doelarray niet vervangen/veranderen. We hebben for-lus gebruikt om de doelarray te herhalen en de hele array af te drukken om te bewijzen dat de bytes-19 tot en met 26 ongewijzigd zijn in de doelarray. Daarom zien we de laatste output als:

“www.linuxhint.com_STRING".

#include
#include
/* Dit programma illustreert de situatie wanneer:
doel tekenreeksgrootte > grootte brontekenreeks
en we voeren de functie strcpy() uit om de . te kopiëren
brontekenreeks naar bestemming.
Opmerking: de tekenreeksgrootte van de bestemming moet altijd
groter zijn dan of gelijk zijn aan de brontekenreeks.
*/
int hoofd()

char source_str[] = "www.linuxhint.com";
char destination_str[26] = "I_AM_A_DESTINATION_STRING";
printf("Voordat strcpy() functie wordt aangeroepen: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
strcpy(destination_str, source_str);
printf("Na het uitvoeren van de strcpy() functie: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
/* print bestemmingsstring met for loop*/
printf("Druk de bestemmingsreeks char af met char : \n\n");
printf("\tDestination String = ");
for(int i=0; i<25;i++)

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

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

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

We hebben dit programma als een voorbeeld beschouwd om te laten zien dat we nooit strcpy() mogen aanroepen met een letterlijke tekenreeks als doel. Dit zal ongedefinieerd gedrag veroorzaken en uiteindelijk zal het programma crashen.

#include
#include
int hoofd()

char source_str[] = "www.linuxhint.com";
printf("Voordat strcpy() functie wordt aangeroepen: \n\n");
printf("\tBron String = %s\n", source_str);
/* Roep nooit strcpy() aan met letterlijke tekenreeks als bestemming.
Het programma zal crashen.
*/
strcpy("destination_str", source_str);
printf("Na het uitvoeren van de strcpy() functie: \n\n");
printf("\tBron String = %s\n", source_str);
retourneer 0;

strcpy() - Door de gebruiker gedefinieerde versie (voorbeeld5.c):

In dit voorbeeldprogramma hebben we laten zien hoe u een door de gebruiker gedefinieerde versie van de functie strcpy() schrijft.

#include
char * strcpy_user_defined (char * dest, const char * src);
/* Door de gebruiker gedefinieerde versie van de functie strcpy() */
char * strcpy_user_defined(char *dest, const char * src)

char * dest_backup = dest;
while(*src != '\0') /* Herhaal totdat '\0' is gevonden.*/

*bestemming = *src; /* Kopieer bronchar naar bestemming */
src++; /* Bronaanwijzer verhogen */
dest++; /* Bestemmingsaanwijzer verhogen */

*bestemming = '\0'; /* Voeg '\0' expliciet in de bestemming in*/
retour dest_backup;

int hoofd()

char source_str[] = "www.linuxhint.com";
char bestemming_str[30];
printf("Voordat u de door de gebruiker gedefinieerde tekenreekskopieerfunctie aanroept: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
/* Door gebruiker gedefinieerde tekenreekskopieerfunctie aanroepen
strcpy_user_defined(destination_str, source_str);
printf("Na het uitvoeren van de door de gebruiker gedefinieerde tekenreekskopiefunctie: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
retourneer 0;

strcpy() - Door de gebruiker gedefinieerde versie geoptimaliseerd (voorbeeld6.c):

In dit voorbeeldprogramma gaan we nu de door de gebruiker gedefinieerde versie van strcpy() optimaliseren.

#include
char * strcpy_user_defined (char * dest, const char * src);
/* Geoptimaliseerde versie van de door de gebruiker gedefinieerde strcpy()-functie */
char * strcpy_user_defined(char *dest, const char * src)

char * dest_backup = dest;
while(*dest++ = *src++)
;
retour dest_backup;

int hoofd()

char source_str[] = "www.linuxhint.com";
char bestemming_str[30];
printf("Voordat u de door de gebruiker gedefinieerde tekenreekskopieerfunctie aanroept: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
/* Door gebruiker gedefinieerde tekenreekskopieerfunctie aanroepen */
strcpy_user_defined(destination_str, source_str);
printf("Na het uitvoeren van de door de gebruiker gedefinieerde tekenreekskopiefunctie: \n\n");
printf("\tBron String = %s\n", source_str);
printf("\tDestination String = %s\n\n", destination_str);
retourneer 0;

Conclusie:

De functie strcpy() is een zeer populaire en handige bibliotheekfunctie om de bewerking voor het kopiëren van tekenreeksen in de programmeertaal C uit te voeren. Dit wordt voornamelijk gebruikt om de string van de ene naar de andere locatie te kopiëren. We willen echter herhalen dat de functie strcpy() de grenscontrole voor de doelarray niet uitvoert, wat kan leiden tot een ernstige softwarefout als deze wordt genegeerd. Het is altijd de verantwoordelijkheid van de programmeur om ervoor te zorgen dat de doelarray voldoende ruimte heeft om alle tekens van de bronreeks te bevatten, inclusief het NULL-teken.

Shadow of the Tomb Raider voor Linux-zelfstudie
Shadow of the Tomb Raider is de twaalfde toevoeging aan de Tomb Raider-serie - een actie-avonturengame-franchise gemaakt door Eidos Montreal. De game ...
Hoe FPS te verhogen in Linux?
FPS staat voor Beelden per seconde. De taak van FPS is om de framesnelheid te meten bij het afspelen van video's of speluitvoeringen. In eenvoudige wo...
Top Oculus App Lab-games
Als je eigenaar bent van een Oculus-headset, moet je op de hoogte zijn van sideloading. Sideloading is het proces van het installeren van niet-winkeli...