You are on page 1of 12

P

Programacin
i I.
I Tema
T
5
Estructuras de datos.
CADENAS DE CARACTERES

Cadenas de caracteres: Concepto

Es un array unidimensional en el que sus elementos son


caracteres
No
N existe
i t un tipo
ti
especfico.
fi
Declaracin genrica de cadena de caracteres:
char id_cadena [];
char * id_cadena;
Se inicializan como array normal o asignando una
constante de tipo cadena de caracteres.
Si no se especifica el tamao del array, ste ser el
tamao de la cadena ms 1, ya que el compilador
aade el carcter NULL (\0) al final de la cadena.

Programacin I: Estructuras de datos.

Tema 5 - 2

Curso 06/07

Arrays & punteros


En una declaracin de un array tal como:

int numeros [5];

la variable nmeros representa un puntero constante


(no se puede modificar) que contiene la direccin de la
primera posicin del array.
char
char

vocales [5]={a,e,i,o,u};
* letra;

Por ejemplo:

posicin0

vocales

letra

100 101 102 103 104

200

posicin N

Tema 5 - 3

Programacin I: Estructuras de datos.


Curso 06/07

Arrays & punteros


Por ejemplo: (Qu cosas estn permitidas?)

char vocales [5]={a,e,i,o,u};


char * letra;
letra = vocales;
/* equivale a letra=&vocales[0];*/
letra++;
/* equivale a letra=&vocales[1];*/
/* o a letra=letra+1; */

vocales

a
b
i
o
u

Por ejemplo: Qu cosas no estn permitidas?


vocales = letra;
vocales ++;

vocales es un puntero cte.

Programacin I: Estructuras de datos.

letra

Tema 5 - 4

Curso 06/07

Cadenas de caracteres. Ejemplo


Ejemplos de declaracin de variables como cadenas de
caracteres en C:
char asignatura [] = programacion1;

13

\0

char asignatura [25] = programacion1;

13

2
o

24

\0

char asignatura [13] = programacion1;

2
o

12
g

Programacin I: Estructuras de datos.

Tema 5 - 5

Curso 06/07

Asignacin de valores

A una cadena de caracteres se le puede asignar valores


como a cualquier array

En la declaracin:

no se puede
d
asignar valores
de esta forma

char
h
asignatura
i
[25] =
programacion1;
i 1
asignatura = programacion1;

Procesndola como cualquier array:


char asignatura[25]=programacion1;
fprintf(stdout,la asignatura es:);
for(i=0;i<14;i++)
(
;
;
)
fprintf(stdout,%c, asignatura[i]);

Usando funciones de librera


Programacin I: Estructuras de datos.

Tema 5 - 6

Curso 06/07

Cadenas y punteros

Una cadena de caracteres puede manejarse mediante un


puntero al primer elemento:
reserva memoria
para la cadena

nombre

char nombre [20];


char *p;
NO reserva memoria
para la cadena

p = nombre;

fscanf(stdin,%s, p);

letra

19

\0

?
19

si tecleamos 1az
Tema 5 - 7

Programacin I: Estructuras de datos.


Curso 06/07

Cadenas y punteros

Una cadena de caracteres constante puede ser


referenciada mediante un puntero, pero el contenido no
se puede alterar mediante dicho puntero:
Ejemplo
char *p = perro;
p
p = gato;
/*incorrecto*/

\0

\0

Programacin I: Estructuras de datos.

Tema 5 - 8

Curso 06/07

Funciones de cadenas de caracteres


fgets

#include <stdio.h>
char * fgets (char *string, int n, FILE *stream );

Lee una lnea de hasta n caracteres del fichero de


entrada (stream) y los almacena en la cadena de
caracteres especificada por string incluyendo el carcter
de newLine (\n) y aadiendo \0 al final.
Si leemos mas de n caracteres almacena n-1 y
substituye
y el carcter n p
por \0.
Valor devuelto:
Si se ha ejecutado correctamente, devuelve un puntero a la
cadena de caracteres leda.
Si ha habido algn error, devuelve un puntero a NULL.
Programacin I: Estructuras de datos.

Tema 5 - 9

Curso 06/07

Funciones de cadenas de caracteres


fputs

#include <stdio.h>
int fputs (const char *string, FILE *stream );

Copia en el fichero de salida (stream) la


cadena de caracteres especificada por string.
Valor devuelto:
Si se ha ejecutado correctamente, devuelve un
valor
l positivo.
iti
Si ha habido algn error, devuelve EOF.

Programacin I: Estructuras de datos.

Tema 5 - 10

Curso 06/07

Funciones de cadenas de caracteres

Ejemplos fgets, fputs:


#include <stdio.h>
void main (void)
{
char nombre [30];
printf (Escriba su nombre: );
fgets (nombre,30,stdin);
printf (\nSu nombre es: );
fputs
f
t (nombre,stdout);
(
b
td t)
.........................

Cmo se controlaran los posibles errores?

Programacin I: Estructuras de datos.

Tema 5 - 11

Curso 06/07

Funciones de cadenas de caracteres


strlen
#include <string.h>
int strlen (const char * string);

Halla la longitud de la cadena de caracteres


string (debe terminar en \0).
Valor devuelto:
Si se ha ejecutado correctamente, devuelve la
l
longitud
it d en bytes
b t de
d la
l cadena
d
string,
ti
sin
i incluir
i l i ell
\0.
Si ha habido algn error, devuelve un cero.
Programacin I: Estructuras de datos.

Tema 5 - 12

Curso 06/07

Funciones de cadenas de caracteres

Codificar un programa en C que lea unas lneas de hasta


N caracteres y las escriba en la pantalla. Terminar cuando
se teclee una lnea vaca.

#include <stdio.h>
#define N 80
void main (void){
char linea [N];
do
{
fgets(linea,N,stdin);
/* precaucin por si linea es menor de N */
if (linea[strlen (linea)-1]==\n)
linea[strlen(linea) 1]=\0;
linea[strlen(linea)-1]=\0;
fputs (la linea es: , stdout);
fputs(linea, stdout);
}while (linea[0]!=`\0);
}

Programacin I: Estructuras de datos.

Tema 5 - 13

Curso 06/07

Funciones de cadenas de caracteres


Funcin de purgado del \n

void LeerCadena(char *string, int n, FILE *stream );


void leerCadena (char *string, int n, FILE *stream ){
fgets(string ,n, stream);
/* precaucin por si linea es
menor de N y hay que quitar el \n*/
if (string[strlen (string)-1]=='\n')
string[strlen(string)-1]='\0';
string[strlen(string)
1] \0 ;
}

Programacin I: Estructuras de datos.

Tema 5 - 14

Curso 06/07

Funciones de cadenas de caracteres


strcpy
#include <string.h>
char* strcpy (char* strDestination,const char* strSource);

Copia la cadena de caracteres strSource


(que debe estar terminada en \0) en la
cadena de caracteres strDestination, incluido
el \0.
Valor devuelto:
Si se ha ejecutado correctamente, devuelve un
puntero a la cadena strDestination.
Si ha habido algn error, devuelve un puntero a
NULL.
Programacin I: Estructuras de datos.

Tema 5 - 15

Curso 06/07

Funciones de cadenas de caracteres


strcmp
#include <string.h>
int strcmp (const char* string1,const char* string2);

Compara la cadena de caracteres string1 con


la cadena de caracteres string2.
Ambas cadenas deben terminar en \0.

Valor devuelto:
Si string1
g es igual a string2,
g devuelve un cero.
Si string1 es menor que string2, devuelve un
nmero negativo.
Si string1 es mayor que string2, devuelve un
nmero positivo.
Programacin I: Estructuras de datos.

Tema 5 - 16

Curso 06/07

Funciones de cadenas de caracteres

Ejemplo - strcmp, strcpy, strlen:

#include <stdio.h>
#include <string.h>
#define DIM 30
(char *string,
g, int n,
, FILE *stream );
void leerCadena (
void main (void){
char nombre1 [DIM];
char nombre2 [] = "pepe";
int aux,i;
fprintf (stdout,"Escriba su nombre: ");
leerCadena (nombre1, DIM, stdin);
aux = strcmp (nombre1,nombre2);
if (aux == 0)
fprintf (stdout,"Hola bienvenido pepe\n");
else {
if (aux < 0)
fprintf (stdout,"Hola tu nombre no es pepe, es menor\n");
else
fprintf (stdout,"Hola tu nombre no es pepe, es mayor\n");
}
}
Programacin I: Estructuras de datos.

Tema 5 - 17

Curso 06/07

Funciones de cadenas de caracteres


strchr
#include <string.h>
char
c
a * st
strchr
c
(co
(const
st c
char
a * st
string,
g, int
t c);

Busca el carcter c en la cadena de


caracteres string (debe terminar en \0).
Valor devuelto:
Si el carcter buscado se encuentra en la
cadena, devuelve un puntero a la primera
aparicin del carcter.
Si el carcter no se encuentra, devuelve un
puntero a NULL.
Programacin I: Estructuras de datos.

Tema 5 - 18

Curso 06/07

Funciones de cadenas de caracteres


Ejemplo - strchr :
#include <stdio.h>
#include <string.h>
void
id main
i (
(void)
id)
{
char direccion [50];
int caracter = M;
/* Carcter buscado */
char *punt; /* Apuntar al valor devuelto
por strchr */
strcpy (direccion,Calle Mayor n. 11);
punt = strchr (direccion,caracter);
if (punt != NULL)
fprintf (stdout,El carcter %c est en
l cadena
la
d
% \ *
%s\n,*punt,direccion);
t di
i )
else
fprintf (stdout,El caracter %c no se ha
encontrado.\n,caracter);
}

Programacin I: Estructuras de datos.

Tema 5 - 19

Curso 06/07

Funciones de cadenas de caracteres


strtok
#include <string.h>
char* strtok (char* strToken, const char* strDelimit);

Busca
B
ell siguiente
i i t d
delimitador
li it d strDelimit
t D li it en
la cadena de caracteres strToken (debe terminar en
\0).

Valor devuelto:
Cada vez que se invoca devuelve un puntero a
una palabra de la cadena strToken,
strToken en la que se
consideran como delimitadores de palabra los
especificados en strDelimit.
Cuando no se encuentran ms palabras,
devuelve un puntero a NULL.
Programacin I: Estructuras de datos.

Tema 5 - 20

Curso 06/07

10

Funciones de cadenas de caracteres


Ejemplo - strtok :
#include <stdio.h>
#include <string.h>
void main (void)
{
char *cad = Prueba, cadena-pequea- con separadores,
varios.fin;
char *palabra;
palabra = strtok (cad, ,.-);
while (palabra != NULL)
{
fprintf (stdout,%s\n,palabra);
palabra = strtok (NULL, ,.-);
}

la primera vez se
pasa la cadena y el
resto el valor NULL

Programacin I: Estructuras de datos.

Tema 5 - 21

Curso 06/07

Funciones de cadenas de caracteres

Ejercicio propuesto :Presentar un mensaje por


pantalla indicando si una secuencia de 10
caracteres es palndromo.
Una secuencia
U
i d
de caracteres
t
es palndromo
l d
sii se lee
l
igual
i
l
de derecha a izquierda que de izquierda a derecha.

Mirar si es palndromo
INICIO
Mientras principio < final y
sean iguales los elementos del array de ndices principio y
final hacer
principio <- siguiente(principio+1)
final<-anterior(final-1)
finMientras
FIN
Programacin I: Estructuras de datos.

Tema 5 - 22

Curso 06/07

11

Funciones de cadenas de caracteres


#include <stdio.h>
#define LONGITUD 10
void main (void){
char secuencia[LONGITUD+1]; /* palabra a analizar */
int principio = 0;
int palin;
int final = LONGITUD-1;
fprintf(stdout,Teclee una secuencia de 10 caracteres: \n);
leerCadena(secuencia);
while ((principio < final)&&
(palin = (secuencia[principio]==secuencia[final])))
{
principio = principio + 1;
final = final - 1;
}
if (palin)
fprintf(stdout,Es una secuencia palndromo);
else
fprintf(stdout,No es una secuencia palndromo);
}

Programacin I: Estructuras de datos.

Tema 5 - 23

Curso 06/07

Ejercicio

Buscar
us a si
s una
u a determinada
d
ada cadena
ad a de
d
caracteres est contenida en otra.
Solo mirar la primera ocurrencia.

Programacin I: Estructuras de datos.

Tema 5 - 24

Curso 06/07

12

You might also like