Cadenas de caracteres Cadenas de caracteres Las cadenas de caracteres (también llamadas cadenas o strings) son un tipo particular de vectores (de hecho son vectores de tipo char), con la particularidad de que tienen una marca de fin (el carácter ‘\0’). Estructura de una cadena: char <identificador>[longitud_máxima]; Algunos ejemplos: char nombre[]=”Hola”; char nombre2[]={‘H’,’o’,’l’,’a’,’\0’}; //Esta manera es igual a la anterior char vector[]={‘H’,’o’,’l’,’a’}; char cadena[100]=”Esto es una cadena en c”; char vacia[]=””; Al declarar un vector se define la cantidad de elementos que puede contener, en el caso de las cadenas se debe tener en cuenta el espacio adicional necesario para el carácter ‘\0’. En los ejemplos, tanto la cadena “nombre” como “nombre2” tienen un largo de 5, y “vacia” tiene un largo de 1. Leyendo cadenas de caracteres desde teclado Para asignar la entrada estándar a una cadena se puede usar la función scanf con la opción %s (cadenas sin espacios) o también %[^\n] (cadenas con espacios hasta el fin de línea). Ejemplo: int main() { char nombres[30], apellido[15]; printf(“Ingrese sus nombres: “); scanf(“%[^\n]”, nombres); //Lee caracteres hasta el fin de línea printf(“Ingrese su apellido: “); scanf(“%s”, apellido); //Lee caracteres hasta el primer espacio printf(“Usted es: %s %s”, nombres, apellido); } Nótese que no se requiere utilizar el operador & en el scanf para el argumento, ya que el nombre del arreglo es un apuntador estático al arreglo. El %s puede delimitar los caracteres a considerar como máximos a tomar para almacenar en una cadena. Por ejemplo, %24s indica que 24 es la máxima cantidad de caracteres que esperamos que ingresen. Si se intenta ingresar más de 24 sencillamente no se almacenarán. Esta es una buena costumbre cada vez que se utiliza scanf para capturar cadenas. Ejemplo: int main() { char nombre[25]; printf(“Ingrese su nombre: ”); scanf(“%24s”, nombre); printf(“Su nombre es: %s”, nombre); } Lenguaje C no maneja cadenas de caracteres como se hace con enteros o flotantes, por lo que lo siguiente no es válido: int main() { char nombres[40], apellidos[40], completo[80]; nombres=”Maria Jose”; //Asignaciones ilegales apellidos=”Bautista Saavedra”; completo=nombres+apellidos; //Operación ilegal } Manejo de cadenas en C Para trabajar con cadenas de caracteres, es necesaria la utilización de la librería <string.h>, que contiene la definición de macros, constantes, funciones y tipos de utilidad para trabajar con cadenas de caracteres. Las funciones declaradas en <string.h> funcionan en cualquier plataforma que soporte ANSI C. Sin embargo, existen algunos problemas de seguridad con estas funciones, como el desbordamiento (overflow) de arreglos, que hacen que algunos programadores prefieran opciones más seguras frente a la portabilidad que estas funciones ofrecen. Además, las funciones para cadenas de caracteres sólo trabajan con conjuntos de caracteres ASCII o extensiones ASCII compatibles. Funciones más conocidas: Nombre strcat() Ejemplo strcat(a,b) strlen() strlen(s) Descripción Añade la cadena “b” al final de la “a”. Devuelve la cadena “a”. Devuelve la longitud de la cadena “s”. Copia en la cadena “b” lo que se encuentra en la cadena “a”. strcmp() strcmp(a,b) Compara la cadena “a” con la cadena “b” y devuelve un número mayor, igual, o menor a cero de acuerdo a los siguientes casos: 1.- Si strcmp(a,b)>0, “a” es mayor que “b”. 2.- Si strcmp(a,b)<0, “b” es mayor que “a”. 3.- Si strcmp(a,b)==0, “a” es igual que “b”. strcpy() srtcpy(b,a) ASCII ASCII (American Standard Code for Information Interchange – Código Estándar Estadounidense para el Intercambio de Información), es un código de caracteres basado en el alfabeto latino, tal como se usa en inglés moderno. Fue creado en 1963 por el Comité Estadounidense de Estándares (ASA, conocido desde 1969 como el Instituto Estadounidense de Estándares Nacionales, o ANSI) como una evolución de los conjuntos de códigos utilizados entonces en telegrafía. Más tarde, en 1967, se incluyeron las minúsculas, y se redefinieron algunos códigos de control para formar el código conocido como US-ASCII. El código ASCII utiliza 7 bits para representar los caracteres, aunque inicialmente empleaba un bit adicional (bit de paridad) que se usaba para detectar errores de transmisión. ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado por última vez en 1986. En la actualidad define códigos para 32 caracteres no imprimibles, de los cuales la mayoría son caracteres de control que tienen efecto sobre cómo se procesa el texto, más otros 95 caracteres imprimibles que les siguen en la numeración (empezando por el carácter “espacio”). Casi todos los sistemas informáticos actuales utilizan el código ASCII o una extensión compatible para representar textos y para el control de dispositivos que manejan texto como el teclado. Las computadoras solamente entienden números. El código ASCII es una representación numérica de un carácter como ‘a’ o ‘@’. Como otros códigos de formato de representación de caracteres, el ASCII es un método para una correspondencia entre cadenas de bits y una serie de símbolos (alfanuméricos y otros), permitiendo de esta forma la comunicación entre dispositivos digitales así como su procesado y almacenamiento. El código de caracteres ASCII, o una extensión compatible, se usa en casi todos los ordenadores, especialmente con ordenadores personales y estaciones de trabajo. El nombre más apropiado para este código de caracteres es US-ASCII. A modo de resumen, en el código ASCII a cada carácter le corresponde un número. Veamos el siguiente ejemplo: int main() { Char a=’A’; printf(“Su equivalente numerico es: %d”, a) } El programa mostrará por pantalla el número 65 (ver tabla) ya que ese es su equivalente según el código ASCII. Ejemplos 1.- Escriba un algoritmo en C que dada una cadena de caracteres, determine su largo (cantidad de caracteres que posee). a) Sin usar las funciones de la librería <string.h> int largo_cadena(char cadena[]) //Corresponde a una función { int largo=0; while(cadena[largo]!=’\0’) { largo++; } return largo; } b) Usando las funciones de la librería <string.h> int main() { char vector[]=”Hola a todos”; int largo; largo=strlen(vector); printf(“El largo de la cadena es: %d”, largo); }