Com s'utilitza Strcpy () en llenguatge C?

How Use Strcpy C Language



En aquest article, aprendrem sobre la funció strcpy () en el llenguatge de programació C. La funció strcpy () és una funció de biblioteca estàndard molt popular per realitzar l'operació de còpia de cadenes en el llenguatge de programació C. Hi ha diversos fitxers de capçalera estàndard en llenguatge de programació C per realitzar operacions estàndard. El string.h és un d'aquests fitxers de capçalera, que proporciona diverses funcions de biblioteca estàndard per realitzar operacions de cadena. La funció strcpy () és una de les funcions de biblioteca proporcionades per string.h.

Sintaxi:

char* strcpy (char*ubicació_destinació, const char*cadena_origen);

Comprensió de strcpy ():

L'únic propòsit de la funció strcpy () és copiar una cadena de font a destinació. Ara, vegem la sintaxi anterior de la funció strcpy (). La funció strcpy () és capaç d’acceptar dos paràmetres:







  • char * destinació
  • const char * font

La font és aquí una constant per garantir que la funció strcpy () no pugui canviar la cadena d'origen. La funció strcpy () copia tots els caràcters (inclòs el caràcter NULL al final de la cadena) de la cadena d'origen a la destinació. Un cop finalitzada l'operació de còpia de l'origen a la destinació, la funció strcpy () torna l'adreça de la destinació a la funció de la persona que truca.



El punt important que cal tenir en compte aquí és que la funció strcpy () no afegeix la cadena d'origen amb la cadena de destinació. Més aviat substitueix el contingut de la destinació pel contingut de la cadena d'origen.



A més, la funció strcpy () no realitza cap comprovació per assegurar-se que la mida de la destinació és superior a la cadena d'origen, és responsabilitat total del programador.





Exemples:

Ara veurem diversos exemples per entendre la funció strcpy ():

  1. strcpy () - Operació normal (exemple1.c)
  2. strcpy () - Cas-1 (exemple2.c)
  3. strcpy () - Cas-2 (exemple3.c)
  4. strcpy () - Cas-3 (exemple4.c)
  5. strcpy () - Versió definida per l'usuari (exemple5.c)
  6. strcpy () - Versió definida per l'usuari optimitzada (exemple6.c)

strcpy () - Operació normal (exemple1.c):

Aquest programa d'exemple mostra com realitzar una operació normal de còpia de cadenes mitjançant la funció strcpy () en el llenguatge de programació C. Tingueu en compte que la longitud de la cadena de destinació és 30 (char destination_str [30];), que és superior a la longitud de la cadena d'origen (la longitud és 18 inclòs el caràcter NULL), de manera que la destinació pot allotjar tots els caràcters de la cadena font.



#incloure
#incloure

intprincipal()
{
charfont_str[] = 'Www.linuxhint.com';
chardestinació_str[30];

printf (Abans de trucar a la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

strcpy (destinació_str,font_str);

printf ('Després d'executar la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

tornar 0;
}

strcpy () - Cas-1 (exemple2.c):

La intenció d’aquest programa d’exemple és explicar clarament què passa quan la longitud de la cadena de destinació és inferior a la longitud de la cadena d’origen. En aquests casos, la ubicació de destinació no tindrà prou espais / bytes per allotjar tots els caràcters (inclòs el caràcter NULL) de la cadena d'origen. Cal tenir en compte dues coses:

  1. La funció strcpy () no comprovarà si la destinació té prou espai.
  2. Això pot ser perillós en el programari incrustat perquè strcpy () substituirà l'àrea de memòria més enllà del límit de la destinació.

Vegem l'exemple de programa. Hem declarat source_str i l’hem inicialitzat a www.linuxhint.com , que trigarà 18 bytes a la memòria, inclòs el caràcter NUL al final de la cadena. Llavors, hem declarat una altra matriu de caràcters, és a dir, destination_str amb la mida de només 5. Per tant, destination_str no pot contenir la cadena d'origen amb una mida total de 18 bytes.

Però, tot i així, estem trucant a la funció strcpy () per copiar la cadena d'origen a la cadena de destinació. A la sortida següent, podem veure que strcpy () no es va queixar en absolut. En aquest cas, la funció strcpy () començarà a copiar el caràcter de la cadena d'origen (fins que trobi el caràcter NULL a la cadena d'origen) a l'adreça de destinació (encara que el límit de destinació sigui superior). Això significa que la funció strcpy () no fa cap control de límits per a la matriu de destinació. Finalment, la funció strcpy () sobreescriurà les adreces de memòria que no s’assignin a la matriu de destinació. És per això que la funció strcpy () acabarà sobreescrivint les ubicacions de memòria que podrien assignar-se a una variable diferent.

En aquest exemple, podem veure a la sortida següent, que la funció strcpy () sobreescriu la cadena d'origen mateixa. Els programadors sempre han de tenir cura amb aquest comportament.

#incloure
#incloure

intprincipal()
{
charfont_str[] = 'Www.linuxhint.com';
chardestinació_str[5];

printf (Abans de trucar a la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

strcpy (destinació_str,font_str);

printf ('Després d'executar la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

// printf ('Adreça font =% u (0x% x) n', & source_str [0], & source_str [0]);
// printf ('Adreça de destinació =% u (0x% x) n', & destination_str [0], & destination_str [0]);

tornar 0;
}

strcpy () - Cas-2 (exemple3.c):

Aquest programa il·lustra la situació en què la mida de la cadena de destinació és superior a la mida de la cadena d'origen i la cadena de destinació ja s'ha inicialitzat amb algun valor. En aquest exemple, hem inicialitzat:

  • font_str a www.linuxhint.com [mida = 17 + 1 = 18]
  • destination_str a I_AM_A_DESTINATION_STRING [mida = 25 + 1 = 26]

La funció strcpy () copiarà tots els 17 caràcters i el caràcter NULL de la cadena d'origen a la cadena de destinació. Però no substituirà / canviarà els bytes restants (Byte 19 a 26, basat en un) a la matriu de destinació. Hem utilitzat el bucle per iterar sobre la matriu de destinació i imprimir tota la matriu per demostrar que els bytes -19 a 26 no tenen canvis a la matriu de destinació. És per això que veiem l'última sortida com:

www.linuxhint.com_STRING .

#incloure
#incloure


/ * Aquest programa il·lustra la situació en què:

mida de la cadena de destinació> mida de la cadena d’origen

i executem la funció strcpy () per copiar el fitxer
cadena d'origen fins al destí.

Nota: la mida de la cadena de destinació sempre ha de ser
ser superior o igual a la cadena d'origen.
* /

intprincipal()
{
charfont_str[] = 'Www.linuxhint.com';
chardestinació_str[26] = 'I_AM_A_DESTINATION_STRING';

printf (Abans de trucar a la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

strcpy (destinació_str,font_str);

printf ('Després d'executar la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);


/ * imprimeix la cadena de destinació mitjançant el bucle for * /
printf ('Imprimiu la cadena de destinació per caràcters: n n');
printf (' tCadena de destinació = ');

per(intjo=0;jo<25;jo++)
{
printf ('% C',destinació_str[jo]);
}
printf (' n n');

tornar 0;
}

strcpy () - Cas-3 (exemple4.c):

Hem considerat aquest programa com un exemple per demostrar que mai no hem de trucar a strcpy () amb una literal de cadena com a destinació. Això provocarà un comportament indefinit i, finalment, el programa fallarà.

#incloure
#incloure

intprincipal()
{
charfont_str[] = 'Www.linuxhint.com';

printf (Abans de trucar a la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);

/ * No truqueu mai a strcpy () amb una cadena literal com a destinació.
El programa es bloquejarà.
* /

strcpy ('destination_str',font_str);

printf ('Després d'executar la funció strcpy (): n n');
printf (' tCadena font =% s n',font_str);

tornar 0;
}

strcpy () - Versió definida per l'usuari (exemple5.c):

En aquest exemple, hem mostrat com escriure una versió definida per l'usuari de la funció strcpy ().

#incloure
char *strcpy_user_defined(char *dest, const char *src);

/ * Versió definida per l'usuari de la funció strcpy () * /
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backup=dest;

mentre(*src! = ' 0') / * Iterar fins que es trobi ' 0'. * /
{
*dest= *src; / * Copia el codi font a la destinació * /
src++; / * Incrementa el punter de la font * /
dest++; / * Incrementa el punter de destinació * /
}

*dest= ' 0'; / * Insereix explícitament ' 0' a la destinació * /

tornardest_backup;
}

intprincipal()
{
charfont_str[] = 'Www.linuxhint.com';
chardestinació_str[30];

printf (Abans de trucar a la funció de còpia de cadena definida per l'usuari: n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

/ * Funció de còpia de cadena definida per l'usuari * /
strcpy_user_defined(destinació_str,font_str);

printf ('Després d'executar la funció de còpia definida per l'usuari: n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

tornar 0;
}

strcpy () - Versió definida per l'usuari optimitzada (exemple6.c):

Ara, en aquest programa d'exemple, optimitzarem la versió definida per l'usuari de strcpy ().

#incloure
char *strcpy_user_defined(char *dest, const char *src);


/ * Versió optimitzada de la funció strcpy () definida per l'usuari * /
char *strcpy_user_defined(char *dest, const char *src)
{
char *dest_backup=dest;

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

tornardest_backup;
}

intprincipal()
{
charfont_str[] = 'Www.linuxhint.com';
chardestinació_str[30];

printf (Abans de trucar a la funció de còpia de cadena definida per l'usuari: n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

/ * Funció de còpia de cadena definida per l'usuari * /
strcpy_user_defined(destinació_str,font_str);

printf ('Després d'executar la funció de còpia definida per l'usuari: n n');
printf (' tCadena font =% s n',font_str);
printf (' tCadena de destinació =% s n n',destinació_str);

tornar 0;
}

Conclusió :

La funció strcpy () és una funció de biblioteca molt popular i útil per realitzar l'operació de còpia de cadenes en el llenguatge de programació C. S'utilitza principalment per copiar la cadena d'una ubicació a una altra ubicació. Tot i això, volem reiterar el fet que la funció strcpy () no fa la comprovació de límits de la matriu de destinació, cosa que pot comportar un error de programari greu si s’ignora. Sempre és responsabilitat del programador assegurar-se que la matriu de destinació tingui prou espai per contenir tots els caràcters de la cadena font, inclòs el caràcter NULL.