You are on page 1of 12

Cadenas

CONTENIDO

Cadenas de Caracteres (un caso especial de tablas)


Declaración de variables CADENAS y definición de tipos.
Manejo de Cadenas. La librería String.h.
Paso de parámetros de Cadenas.

Curso 05-06.Práctica 5 1
Cadenas de Caracteres

El lenguaje C no tiene tipo predefinidos de datos para


almacenar cadenas de caracteres.
Se puede conseguir un tipo de dato que permita el
almacenamiento de cadenas de caracteres mediante el uso de
tablas.

Declaración de una variable Cadena: (LEA vs C)

LEA C
nombre: cadena char nombre [dim];

Curso 05-06.Práctica 5 2
Cadenas de Caracteres

Declaración de Cadena: (Ejemplo)


C
#define MAXCAR 256
char palabra [MAXCAR];
Se pueden
char palabra [MAXCAR]={'H','o','l','a','\0'};
char palabra [MAXCAR]="Hola"; inicializar en el
momento de la
char palabra declaración
El último
[ ]="Hola";
La dimensión se elemento de la
ajusta cadena es el
al tamaño del carácter '\0'
valor inicial
H o l a \0 H o l a \0 ? ? ... ?

0 1 2 3 4 0 1 2 3 4 5 6 ... maxcar-1

Curso 05-06.Práctica 5 3
Cadenas de Caracteres

Definición del Tipo Cadena: (LEA vs C)

LEA C
const #define MAXCAR 256
MAXCAR: 255 typedef char
tipos Cadena[MAXCAR];
cadena: tabla[MAXCAR]
de caracter Cadena palabra;
var
palabra: cadena

¡No ocupa
memoria!
Curso 05-06.Práctica 5 4
Cadenas de Caracteres

Acceso a los elementos de una cadena


Se realizan usando números enteros llamados índices.

LEA
nombre_cadena[índice] palabra[1] :=
’h’
(el índice comienza en 1)

C
nombre_cadena[índice] palabra[0] =
’h’;
(el índice comienza
palabraen 0)h o l a \0 ? ... ? ?
0 1 2 3 4 5 ... 255

Curso 05-06.Práctica 5 5
Cadenas de Caracteres

Lectura y Escritura de Cadenas: (LEA vs C)


Sin el &
¡cadena es una
dirección!
LEA C
Lectura Lectura
leer cadena scanf ("%s", cadena);
gets (cadena);
Escritura Escritura
escribir cadena printf ("%s", cadena);
puts (cadena);

Curso 05-06.Práctica 5 6
Cadenas de Caracteres

Lectura y Escritura de Cadenas: (Ejemplos)


LEA C
Lectura Lectura
leer palabra scanf ("%s", palabra);
gets (palabra);
Escritura Escritura
escribir “Hola” printf ("%s", “Hola”);
puts (“Hola”);
Diferencia entre scanf y gets:
scanf se detiene al encontrar un espacio en blanco, un
tabulador o un ‘\n’, que no se lee (se quedan en el buffer de
entrada -con fflush(stdin) se limpia el buffer- ), y añade un ‘\0’
al final.
gets lee hasta encontrar un ‘\n’, que se lee (el buffer de
entrada queda vacío), y se sustituye por un ‘\0’.
Curso 05-06.Práctica 5 7
Cadenas de Caracteres

Funciones para la manipulación de cadenas:(LEA vs C)


LEA C
longitud strlen( ) /* longitud */
:= strcpy( ) /* asignación */
>, <, >=, <=, =, <> strcmp( ) /* comparación */

Estas funciones
están incluidas en
el fichero de
cabecera string.h

Curso 05-06.Práctica 5 8
Cadenas de Caracteres

Funciones para la manipulación de cadenas:(Ejemplos)

LEA C
l := longitud (cadena) l = strlen (cadena);

cadena1 := “Hola” strcpy (cadena1, “Hola”);

si (cadena1 = cadena2) if ( strcmp (cadena1,


escribir "Las cadenas son cadena2) == 0)
iguales" puts ("Las cadenas son
iguales");
si (cadena1 > cadena2)
escribir "La 1ª cadena es if ( strcmp(cadena1,
mayor" cadena2) > 0)
puts ("La 1ª cadena es
si (cadena1 < cadena2) mayor");
escribir "La 1ª cadena es
menor" if ( strcmp (cadena1,
Curso 05-06.Práctica 5 9
Cadenas de Caracteres

Tabla de cadenas:(LEA vs C)

LEA C
nombre: tabla[dim] de Cadena nombre[dim];
cadena

Curso 05-06.Práctica 5 10
Cadenas de Caracteres

Tabla de cadenas:(Ejemplo)

LEA C
const #define NDIAS 7
NDIAS: 7 #define MAXCAR 256
typedef char
var 25 Cadena[MAXCAR];
diasSemana:6
tabla[NDIAS]
L u n e s \0 de cadena Cadena
Ma r t e s \0 diasSemana[NDIAS];
Mi é r c o l e s \0 Cadena diasSemana[NDIAS]
7 Ju e v e s \0 = {“Lunes”,
V i e r n e s \0
Sáb a d o \0 “Martes”,
Dom i n g o \0 ”Miércoles”, ”Jueves”,
“Viernes”, ”Sábado”,
Curso 05-06.Práctica 5 “Domingo”}; 11
Cadenas de Caracteres

Cadenas en C y Punteros

Alternativas para la declaración ¡Atención!


de una cadena
a) Cadena palabra; No son equivalentes. En el
b) char palabra[MAXCAR]; caso b) se reserva
c) char *palabra; memoria, en el caso c) no.
Sin embargo, ambos
sirven para declarar una
cadena.
En la definición de una función
válido porque el
a) void funcion (Cadena cadena1, Cadena nombre de una
cadena2)
b) void funcion (char cadena1[ ], char tabla
cadena2[ ]es) la
c) void funcion (char *cadena1, char dirección
*cadena2) del
comienzo de la
tabla en memoria,
por tanto, se
Curso 05-06.Práctica 5 puede almacenar 12