¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Desarrollo informático
  3. Las cadenas de caracteres
Extrait - Desarrollo informático Aprenda a diseñar antes de programar
Extractos del libro
Desarrollo informático Aprenda a diseñar antes de programar Volver a la página de compra del libro

Las cadenas de caracteres

Objetivos del capítulo

Desarrollar aplicaciones que utilizan cadenas de caracteres.

Presentación

1. Definición

En C, no hay un tipo «cadena de caracteres».

Una cadena de caracteres es una sucesión de bytes terminada por un byte con valor 0.

De todas formas hemos utilizado (en las funciones scanf, printf) cadenas de formato de edición o introducción de datos, rodeados entre: " ". Por convención, esta notación designa la dirección en memoria de una sucesión de bytes terminada por un byte con valor cero. Dicho de otra manera, el operador " " devuelve la dirección en memoria del primer byte de la cadena. Cada byte contiene el código ASCII de un carácter.

2. Visualización de las letras de una cadena y de sus direcciones

La declaración char* cadena reserva una zona de memoria que puede contener una dirección de un entero de tipo char:

int main()  
{  
   char* cadena; 
images/a42.png
    cadena = "Ganso"; 

La siguiente instrucción inserta en cadena la dirección del primer carácter de la cadena constante "Ganso".

images/a43.png

Recuerde: la notación ‘o’(comilla simple) significa el código ASCII de la letra e (101).

El siguiente código se corresponde con un bucle de visualización de caracteres, de sus códigos ASCII y de sus direcciones. El bucle termina cuando encuentra el carácter de código ASCII 0 (cero).

   printf("%c...

Visualización de una cadena de caracteres

Las funciones printf() y puts() permiten mostrar una cadena de caracteres.

int main()  
{  
   char* direccion;  
   direccion = “Ganso”; 

Las dos instrucciones siguientes producen el mismo resultado:

   puts(direccion);  
   printf("%s\n", direccion); 

Reciben como argumento una dirección (char*). Muestran el carácter correspondiente al byte que se encuentra en esta dirección y después todos los bytes que siguen hasta el byte con valor 0:

El siguiente código se corresponde con una experiencia «divertida» de modificación de la dirección de la cadena que se ha de mostrar.

La dirección de inicio de la visualización se incrementa en cada iteración. El bucle se detiene cuando el valor que se encuentra en esta dirección es el 0 final:

   printf("\n\n");  
   puts(direccion);  
  
   do  
   {  
       direccion++;  
       puts(direccion);  
   }  
   while(*direccion!= 0);  
  
   return 0;  
} 

A continuación se muestra el resultado de la ejecución de este programa:

images/a49bis.png

La experiencia «divertida»...

Almacenamiento de una cadena de caracteres

1. Tabla de caracteres

Para insertar una cadena en una variable, se utiliza una tabla de char (o unsigned char) suficientemente grande como para contener todas las letras (todos los códigos ASCII de las letras) y el 0 final.

La tabla cadena se destina a recibir una cadena de caracteres de 80 caracteres, más el 0 final:

int main()  
{  
   char cadena[81]; 

La función gets(cadena) es una función de introducción de datos por teclado que almacena todos los caracteres escritos por el teclado a partir de la dirección cadena, hasta el final del valor introducido (provocado por la pulsación de la tecla [Intro]). Añade el 0 final:

   printf("Rellenar una cadena de caracteres: ");  
   gets(cadena); 
images/a44.png
   printf("\n\nCadena introducida --> ");  
   puts(cadena);  
  
   return 0;  
} 

A continuación se muestra el resultado de la ejecución de este programa:

images/a45.png

Las zonas de almacenamiento deben ser variables inicialmente reservadas, como es el caso de la tabla cadena.

2. Errores actuales

Los dos programas siguientes ilustran los errores actuales en el tratamiento de las cadenas.

  • El primero ilustra un intento de almacenamiento en una zona no reservada.

  • El segundo ilustra un intento de modificación de una dirección...

Librería estándar de manipulación de cadenas: string.h

1. Lista de las funciones

  • strcpy    char *strcpy(char *destino, const char *origen)

    Copia la cadena origen en la dirección destino (incluido el 0 del final) y proporciona como retorno la dirección de destino.

  • strncpy    char *strncpy(char *destino, const char *origen, int lgmax)

    Copia como máximo lgmax caracteres de la cadena origen en la dirección destino (incluidos el 0 del final), eventualmente completado por 0 si esta longitud máxima no se alcanza. La función proporciona como retorno la dirección de destino.

  • strcat    char *strcat(char *destino, const char *origen)

    Vuelve a copiar la cadena origen al final de la cadena destino y proporciona como retorno la dirección de destino.

  • strncat char *strncat(char *destino, const char *origen, int lgmax)

    Vuelve a copiar como máximo lgmax caracteres de la cadena origen al final de la cadena destino y proporciona como retorno la dirección de destino.

  • strcmp    int strcmp(const char *cadena1, const char *cadena2)

    Compara cadena1 y cadena2 y proporciona:

  • El valor 0 si cadena1 = cadena2;

  • Un valor inferior a 0 si cadena1 < cadena2;

  • Un valor superior a 0 si cadena1 > cadena2.

  • strncmp    int strncmp(const char *cadena1, const char *cadena2, int lgmax)

    Realiza la misma operación que la función strcmp, limitando la comparación...

Utilización de las cadenas para los valores numéricos

Rellenar valores numéricos usando la función scanf() es práctico. La utilización de esta función puede producir algunas anomalías.

1. Problema del scanf()

La función scanf() se debe utilizar con precaución. En particular, en caso de introducción errónea de datos numéricos. El siguiente programa introduce dos datos numéricos consecutivos:

int main()  
{  
   int i;  
   double x;  
  
   printf("Rellenar el entero i: ");  
   scanf("%d", &i);  
   printf("i = %d\n", i);  
  
   printf("\n\nRellenar el doble x: ");  
   scanf("%lf", &x);  
   printf("x = %lf\n", x);  
  
   return 0;  
} 

A continuación se muestra el resultado de la ejecución de este programa:

images/a47.png

Los datos introducidos por el teclado se almacenan en un espacio de memoria denominado «buffer de teclado». En este espacio, la función scanf() va a buscar la información que espera. Si el buffer está vacío, la función espera un valor. Si no está vacío, la función busca directamente los datos...

Trabajo práctico: cadenas de caracteres

1. Tema

Ejercicio 1

Contar el número de ‘o’ contenidas en una cadena introducida por el teclado (máximo 80 caracteres).

Ejercicio 2

Eliminar todos los caracteres ‘o’ contenidos en una cadena introducida por el teclado (máximo 80 caracteres).

Ejercicio 3

Invertir una cadena introducida por el teclado (máximo 80 caracteres).

Ejemplo: introducir «toto», mostrar «otot».

Ejercicio 4

Mostrar la posición del primer y último carácter no en blanco de una cadena introducida por el teclado (máximo 80 caracteres).

Ejercicio 5

  • Rellenar una cadena de caracteres por el teclado (máximo 80 caracteres).

  • Rellenar una subcadena por el teclado.

  • Rellenar una posición (entero).

  • Ubicar la subcadena en la cadena en la posición introducida (la subcadena debe poder insertarse en los 80 caracteres de la cadena).

2. Cadenas de caracteres: proposición de corrección

a. Ejercicio 1

Contar el número de ‘o’ contenidas en una cadena.

fila: el valor introducido por el teclado.

inicio: dirección del inicio de la zona de fila que se va a examinar.

contador: número de ‘o’ encontradas.

int main()  
{  
   char fila[81];   
   char* inicio;  
   int contador;  
  
   printf("Escribir una fila (máximo 80 caracteres):\n");  
   gets(fila);  
  
   contador = 0; 

La función strchr() busca un carácter a partir de una dirección. La función strchr() siguiente busca ‘o’ a partir del inicio de la tabla fila. La variable fila contiene la dirección de la primera (o 0 si no hay ‘o’ en fila):

    inicio = strchr(fila, ‘o'); 

Como inicio no es nulo, hemos encontrado un ‘o’:

   while (inicio!= 0)  
   {  
       contador++; 

El incremento del puntero le sitúa en la letra que sigue a la ‘o’ encontrada:

        inicio++; 

strchr() busca la ‘o’ siguiente:

       inicio = strchr(inicio, ‘o');  
   }  
  
   printf("\n\nNúmero...