Manejo de Cadena de Caracteres Preparado por: J. Huircan Departamento de Ingeniería Eléctrica Universidad de La Frontera 2012 Introducción Las cadenas de caracteres son arreglos unidimensionales usados en C. Estos permiten generar mensajes en modo texto usando el código ASCII. Sin embargo, los caracteres a bajo nivel siguen siendo tratados como bytes. El lenguaje C provee una biblioteca para el manejo de las cadenas cuyas funciones están declaradas en el archivo de cabecera string.h. string.h Cadena Las cadenas de caracteres (string) son arreglos que se componen de caracteres alfanuméricos. El final de una cadena se indica con un caracter especial, éste es un byte compuesto por 8 ceros binarios, es decir 0x00. void main() { char cad[10]; } El tamaño de la cadena debe ser lo suficientemente grande para contener dicho caracter inclusive. Una cadena declarada como cad[10], podrá contener como máximo 9 caracteres, el último será ocupado por 0x00. El archivo de cabecera string.h proporciona una serie de funciones que permiten el manejo de cadenas de caracteres. No existen operadores que permitan comparar cadenas o copiar una cadena en otra, por lo que se debe hacer uso de las funciones definidas en string.h. string.h Función strcpy strcmp strlen strncpy Descripción Copia una cadena en otra cadena Compara dos cadenas Determina el largo de una cadena Copia n caracteres de una cadena a otra La función strcpy es una contracción de la operación string copy py. El uso de estas funciones requiere de un str buen manejo de punteros. Por otro lado, dado que la cadena se define como tipo char, es importante hacer la diferencia por ejemplo entre 'A' y "A", el primero es el caracter A que se codifica en un byte (0x41) y el segundo elemento es una cadena que contiene un caracter A y ocupa dos bytes (0x41, 0x00), el carácter y el fin de cadena. Dado que el final de la cadena contiene el carácter 0x00, si se quiere borrar la cadena, se puede asignar al primer elemento de la cadena dicho carácter cad[0]=0x00. Si se define char cad[10], entonces los elemento se individualizan de acuerdo a la Fig.1. Manejo de cadena de caracteres Protocolos de Comunicación 2012 ¿? ¿? ¿? ¿? ¿? ¿? ¿? ¿? ¿? ¿? Cad[0] Cad[1] Cad[2] Cad[3] Cad[4] Cad[5] Cad[6] Cad[7] Cad[8] Cad[9] ¿? Donde cad[0] es el primer elemento de la cadena y cad[9] el último. El siguiente código define la cadena y la inicializa. El primer ejemplo inicializa caracter a caracter. void main() { char cad[10]; cad[0]=0x00; // borra cadena cad[0]=’H’; cad[1]=’O’; cad[2]=’L’; cad[3]=’A’; cad[4]=0x00; // fin de cadena } El siguiente ejemplo usa la función strcpy. #include <string.h> void main() { char cad[10]; strcpy(cad[0], “HOLA”); } 0x48 0x4f 0x4c 0x41 0x00 Cad[0] Cad[1] Cad[2] Cad[3] Cad[4] ¿¿ ¿¿ ¿¿ ¿¿ ¿¿ Cad[5] Cad[6] Cad[7] Cad[8] Cad[9] ¿¿ O H O L A 0x00 ¿¿ ¿¿ ¿¿ ¿¿ ¿¿ Cad[0] Cad[1] Cad[2] Cad[3] Cad[4] Cad[5] Cad[6] Cad[7] Cad[8] Cad[9] ¿¿ El siguiente ejemplo es realiza traspaso entre dos cadenas y finalmente la imprime en pantalla. #include <stdio.h> #include <string.h> void main() { char cad[10], buf[10]; strcpy(cad, "HOLA"); strcpy(buf, cad); /* Copia en Cad la cadena "HOLA" */ /* Pasa el contenido de cad a buf */ if (!strcmp(buf,cad)) printf("SON IGUALES!"); } La función strcmp permite comparar dos cadenas de caracteres. Esta comparación se realiza hasta el caracter 0x00 de final de cadena. Manejo de cadena de caracteres Protocolos de Comunicación 2012 Variantes del uso de cadenas Debido a que el uso de punteros es fundamental es importante establecer su uso en el manejo de cadenas. En las implementaciones de C la variable puntero se especifica mediante el tipo *identificador luego se tiene y la asignación de la dirección se hace mediante el operador &. De esta forma se tiene #include <string.h> void main() { char cad[10], buf[10]; /* cadenas de caracteres */ char *p; /* puntero a char */ p=&cad[0]; p=cad; /* Asigna la direccion del elemento 0 */ /* Idem */ strcpy(cad,”HOLA”); strcpy(cad[0],”HOLA”); strcpy(&cad[0],”HOLA”); /* son lo mismo */ strcpy(p,”HOLA”); /* Idem strcpy(buf[0],p); /* debido a que el argumento de strcpy es un puntero */ */ } void main() { char cad[10], buf[10]; /* cadenas de caracteres */ strcpy(cad,”HOLA”); strcpy(buf[0],cad[2]); /* inicializando cad */ /* copiando parte de cad en buf */ } void main() { char cad[10]={“HOLA”}; /* Declarando e iniicalizando */ strcpy(buf,cad); /* copiando de cad en buf */ } Caracteres especiales A parte de los caracteres alfanuméricos, es posible el uso de caracteres especiales los cuales son usados por el código ASCII para tareas especiales. Debido a que la cadena es un arreglo de caracteres, los caracteres especiales pueden formar parte de la cadena y pueden ser interpretados de acuerdo a ciertas normas definidas por el usuario. Tabla 2 C aracter ara cter ‘\r’ ‘\n’ ‘ ’ Manejo de cadena de caracteres HEXA 0x0d 0x0A 0x1B DEC 13 10 27 Nombre CR LF ESC Protocolos de Comunicación 2012 Al ser inicializado como carácter puede usarse el código directo. En una cadena se usaran como “\x0d”, “\x0a” #include <string.h> void main(){ char cad[10] ={“hola\xd\xa\x0”}; char buf[10]; strcpy(buf,“hola\xd\xa\x0”); } Referencias [1] Leblanc, G. TurboC para IBM-PC y compatibles Manejo de cadena de caracteres Protocolos de Comunicación 2012