Hoe Strcpy() in C-taal te gebruiken?

How Use Strcpy C Language



In dit artikel gaan we meer te weten komen over de functie strcpy() in de programmeertaal C. De functie strcpy() is een zeer populaire standaardbibliotheekfunctie om de tekenreekskopiebewerking in de programmeertaal C uit te voeren. Er zijn verschillende standaard header-bestanden in de programmeertaal C om standaardbewerkingen uit te voeren. De string.h is een van dergelijke header-bestanden, die verschillende standaardbibliotheekfuncties biedt om stringbewerkingen uit te voeren. De functie strcpy() is een van de bibliotheekfuncties van string.h.

Syntaxis:

char* strcpy (char*bestemming_locatie, 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:







  • char * bestemming
  • const char * bron

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



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 bron string.



#erbij betrekken
#erbij betrekken

inthoofd()
{
charsource_str[] = 'www.linuxhint.com';
charbestemming_str[30];

printf ('Voordat u de strcpy()-functie aanroept:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

strcpy (bestemming_str,source_str);

printf ('Na het uitvoeren van de strcpy() functie:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

opbrengst 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 doelstring kleiner is dan de lengte van de bronstring. 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 , waarvoor 18 bytes in het geheugen nodig zijn om op te slaan, inclusief het Null-teken aan het einde van de tekenreeks. Vervolgens hebben we een andere tekenreeks gedeclareerd, d.w.z. destination_str met de grootte van slechts 5. Dus de destination_str kan de bronstring niet bevatten met een totale grootte van 18 bytes.

Maar toch roepen we de functie strcpy() aan om de bronreeks naar de doelreeks 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 doelarray. 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 mogelijk aan een andere variabele zijn toegewezen.

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

#erbij betrekken
#erbij betrekken

inthoofd()
{
charsource_str[] = 'www.linuxhint.com';
charbestemming_str[5];

printf ('Voordat u de strcpy()-functie aanroept:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

strcpy (bestemming_str,source_str);

printf ('Na het uitvoeren van de strcpy() functie:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

//printf('Bronadres = %u (0x%x) ', &source_str[0], &source_str[0]);
//printf('Bestemmingsadres = %u (0x%x) ', &destination_str[0], &destination_str[0]);

opbrengst 0;
}

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

Dit programma illustreert de situatie waarin de grootte van de doelreeks groter is dan de grootte van de bronreeks en de doelreeks al met een bepaalde waarde is geïnitialiseerd. 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/wijzigen. 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 .

#erbij betrekken
#erbij betrekken


/* Dit programma illustreert de situatie wanneer:

doel tekenreeksgrootte > grootte brontekenreeks

en we voeren de functie strcpy() uit om de . te kopiëren
bronreeks naar bestemming.

Opmerking: de tekenreeksgrootte van de bestemming moet altijd
groter zijn dan of gelijk zijn aan de brontekenreeks.
* /

inthoofd()
{
charsource_str[] = 'www.linuxhint.com';
charbestemming_str[26] = 'I_AM_A_DESTINATION_STRING';

printf ('Voordat u de strcpy()-functie aanroept:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

strcpy (bestemming_str,source_str);

printf ('Na het uitvoeren van de strcpy() functie:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);


/* print bestemmingsstring met for loop*/
printf ('Druk de bestemmingsreeks char voor char af:NN');
printf (' Bestemmingsreeks = ');

voor(intl=0;l<25;l++)
{
printf ('% C',bestemming_str[l]);
}
printf ('NN');

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

#erbij betrekken
#erbij betrekken

inthoofd()
{
charsource_str[] = 'www.linuxhint.com';

printf ('Voordat u de strcpy()-functie aanroept:NN');
printf (' Brontekenreeks = %sN',source_str);

/* Roep nooit strcpy() aan met een letterlijke tekenreeks als bestemming.
Het programma zal crashen.
* /

strcpy ('bestemming_str',source_str);

printf ('Na het uitvoeren van de strcpy() functie:NN');
printf (' Brontekenreeks = %sN',source_str);

opbrengst 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 strcpy()-functie schrijft.

#erbij betrekken
char *strcpy_user_defined(char *bestemming, const char *src);

/* Door de gebruiker gedefinieerde versie van de functie strcpy() */
char *strcpy_user_defined(char *bestemming, const char *src)
{
char *dest_backup=bestemming;

terwijl(*src! = ' 0') /* Herhaal totdat '' is gevonden.*/
{
*bestemming= *src; /* Kopieer bronchar naar bestemming */
src++; /* Bronaanwijzer verhogen */
bestemming++; /* Bestemmingsaanwijzer verhogen */
}

*bestemming= ' 0'; /* Voeg '' expliciet in de bestemming in*/

opbrengstdest_backup;
}

inthoofd()
{
charsource_str[] = 'www.linuxhint.com';
charbestemming_str[30];

printf ('Voordat u de door de gebruiker gedefinieerde tekenreekskopieerfunctie aanroept:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

/* Door gebruiker gedefinieerde tekenreekskopieerfunctie aanroepen */
strcpy_user_defined(bestemming_str,source_str);

printf ('Na het uitvoeren van de door de gebruiker gedefinieerde tekenreekskopiefunctie:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

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

#erbij betrekken
char *strcpy_user_defined(char *bestemming, const char *src);


/* Geoptimaliseerde versie van de door de gebruiker gedefinieerde strcpy()-functie */
char *strcpy_user_defined(char *bestemming, const char *src)
{
char *dest_backup=bestemming;

terwijl(*bestemming++ = *src++)
;

opbrengstdest_backup;
}

inthoofd()
{
charsource_str[] = 'www.linuxhint.com';
charbestemming_str[30];

printf ('Voordat u de door de gebruiker gedefinieerde tekenreekskopieerfunctie aanroept:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

/* Door gebruiker gedefinieerde tekenreekskopieerfunctie aanroepen */
strcpy_user_defined(bestemming_str,source_str);

printf ('Na het uitvoeren van de door de gebruiker gedefinieerde tekenreekskopiefunctie:NN');
printf (' Brontekenreeks = %sN',source_str);
printf (' Bestemmingsreeks = %sNN',bestemming_str);

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