cadenas de caracteres

12
1 P IT 5 P IT 5 Programacn I. Tema 5 Programacn I. Tema 5 Estructuras de datos. CADENAS DE CARACTERES Cadenas de Cadenas de caracteres: caracteres: Concepto Concepto Es un array unidimensional en el que sus elementos son caracteres N it ti ífi No existe un tipo específico. Declaración genérica 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 tamaño del array, éste será el Curso 06/07 Programación I: Estructuras de datos. Tema 5 - 2 Si no se especifica el tamaño del array, éste será el tamaño de la cadena más 1, ya que el compilador añade el carácter NULL (‘\0’) al final de la cadena.

Upload: erick-nolasco

Post on 03-Feb-2016

212 views

Category:

Documents


0 download

DESCRIPTION

asd

TRANSCRIPT

Page 1: Cadenas de Caracteres

1

P ió I T 5P ió I T 5Programación I. Tema 5Programación I. Tema 5

Estructuras de datos.CADENAS DE CARACTERES

Cadenas de Cadenas de caracteres: caracteres: ConceptoConcepto

Es un array unidimensional en el que sus elementos son caracteres

N i t ti ífiNo existe un tipo específico.Declaración genérica 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 tamaño del array, éste será el

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 2

Si no se especifica el tamaño del array, éste será el tamaño de la cadena más 1, ya que el compilador añade el carácter NULL (‘\0’) al final de la cadena.

Page 2: Cadenas de Caracteres

2

Arrays & punterosArrays & punteros

En una declaración de un array tal como:int numeros [5];

la variable números representa un puntero constante(no se puede modificar) que contiene la dirección de la (no se puede modificar) que contiene la dirección de la

primera posición del array.

Por ejemplo:

100 102 103 104101 200

vocales letra

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

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 3

posición0 posición N

0 1 2 3 4

a e i o u

100 102 103 104101 200

?

Arrays & punterosArrays & punteros

Por ejemplo: (¿Qué cosas están permitidas?)

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

vocales

a

Por ejemplo: ¿Qué cosas no están permitidas?

b

i

o

u

letra = vocales; /* equivale a letra=&vocales[0];*/

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

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 4

Por ejemplo: ¿Qué cosas no están permitidas?

vocales = letra; vocales ++; vocales es un puntero cte. letra

Page 3: Cadenas de Caracteres

3

Cadenas de caracteres. EjemploCadenas de caracteres. EjemploEjemplos de declaración de variables como cadenas de caracteres en C:char asignatura [] = “programacion1”;

0 1 2 130 1 2 13

p r o g r a m a c i o n 1 \0

0 1 2 13

p r o g r a m a c i o n 1 \0 ?

24char asignatura [25] = “programacion1”;

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 5

0 1 2 12

p r o g r a m a c i o n 1

char asignatura [13] = “programacion1”;

Asignación de valoresAsignación de valores

A una cadena de caracteres se le puede asignar valores como a cualquier array

En la declaración:h i [25] “ i 1”d char asignatura [25] = “programacion1”;

asignatura = “programacion1”;

no se puede asignar valores de esta forma

Procesándola como cualquier array:char asignatura[25]=“programacion1”;fprintf(stdout,“la asignatura es:”);for(i=0;i<14;i++)

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 6

Usando funciones de librería

( ; ; )fprintf(stdout,“%c”, asignatura[i]);

Page 4: Cadenas de Caracteres

4

Cadenas y punterosCadenas y punteros

Una cadena de caracteres puede manejarse mediante un puntero al primer elemento:

reserva memoria para la cadena

nombre letra

0 1 19

? ? ? ? ? ?char nombre [20];

char *p;

para la cadena

NO reserva memoria para la cadena

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 7

0 1 19

1 a z \0 ?

si tecleamos “1az”

p = nombre;

fscanf(stdin,“%s”, p);

Cadenas y punterosCadenas y punteros

Una cadena de caracteres constante puede ser referenciada mediante un puntero, pero el contenido no se puede alterar mediante dicho puntero:

EjemploEjemplo

char *p = “perro”;

p = “gato”;

/*incorrecto*/

p

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 8

0 1

p e r r o \0 g a t o \0

2 3 4 5 0 1 2 3 4

Page 5: Cadenas de Caracteres

5

Funciones de cadenas de caracteresFunciones de cadenas de caracteres

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

Lee una línea de hasta n caracteres del fichero de entrada (stream) y los almacena en la cadena de caracteres especificada por string incluyendo el carácter de newLine (‘\n’) y añadiendo ‘\0’ al final. Si leemos mas de n caracteres almacena n-1 y

substituye el carácter n por ‘\0’.

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 9

y pValor devuelto:

•Si se ha ejecutado correctamente, devuelve un puntero a la cadena de caracteres leída.•Si ha habido algún error, devuelve un puntero a NULL.

Funciones de cadenas de caracteresFunciones 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 l iti

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 10

valor positivo.•Si ha habido algún error, devuelve EOF.

Page 6: Cadenas de Caracteres

6

Funciones de cadenas de caracteresFunciones 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: ”);f t ( b td t)

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 11

•¿Cómo se controlarían los posibles errores?

fputs (nombre,stdout);.........................

Funciones de cadenas de caracteresFunciones de cadenas de caracteres

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

Halla la longitud de la cadena de caracteresstring (debe terminar en ‘\0’).Valor devuelto:

•Si se ha ejecutado correctamente, devuelve lal it d b t d l d t i i i l i l

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 12

longitud en bytes de la cadena string, sin incluir el‘\0’.•Si ha habido algún error, devuelve un cero.

Page 7: Cadenas de Caracteres

7

Funciones de cadenas de caracteresFunciones de cadenas de caracteresCodificar un programa en C que lea unas líneas de hasta N caracteres y las escriba en la pantalla. Terminará cuando se teclee una línea vacía.

#include <stdio.h>#define N 80

void main (void){char linea [N];do {fgets(linea,N,stdin);/* precaución por si linea es menor de N */if (linea[strlen (linea)-1]==‘\n’)

linea[strlen(linea) 1]=‘\0‘;

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 13

linea[strlen(linea)-1]=‘\0‘;fputs (“la linea es: ”, stdout);fputs(linea, stdout);

}while (linea[0]!=`\0´);}

Funciones de cadenas de caracteresFunciones de cadenas de caracteres

Función de purgado del ‘\n’

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

void leerCadena (char *string, int n, FILE *stream ){

fgets(string ,n, stream);/* precaución por si linea es

menor de N y hay que quitar el \n*/if (string[strlen (string)-1]=='\n')

string[strlen(string)-1]='\0';

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 14

string[strlen(string) 1] \0 ;}

Page 8: Cadenas de Caracteres

8

Funciones de cadenas de caracteresFunciones 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 lacadena de caracteres strDestination, incluidoel ‘\0’.Valor devuelto:

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 15

•Si se ha ejecutado correctamente, devuelve unpuntero a la cadena strDestination.•Si ha habido algún error, devuelve un puntero aNULL.

Funciones de cadenas de caracteresFunciones de cadenas de caracteres

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

Compara la cadena de caracteres string1 conla cadena de caracteres string2.

•Ambas cadenas deben terminar en ‘\0’.Valor devuelto:

•Si string1 es igual a string2, devuelve un cero.

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 16

g g•Si string1 es menor que string2, devuelve unnúmero negativo.•Si string1 es mayor que string2, devuelve unnúmero positivo.

Page 9: Cadenas de Caracteres

9

Funciones de cadenas de caracteresFunciones de cadenas de caracteresEjemplo - strcmp, strcpy, strlen:

#include <stdio.h>#include <string.h>#define DIM 30

void leerCadena (char *string, int n, FILE *stream );( g, , );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 {

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 17

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");

}}

Funciones de cadenas de caracteresFunciones de cadenas de caracteres

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

Busca el carácter c en la cadena de caracteres string (debe terminar en ‘\0’). Valor devuelto:

•Si el carácter buscado se encuentra en la

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 18

cadena, devuelve un puntero a la primera aparición del carácter.•Si el carácter no se encuentra, devuelve un puntero a NULL.

Page 10: Cadenas de Caracteres

10

Funciones de cadenas de caracteresFunciones de cadenas de caracteres

Ejemplo - strchr :#include <stdio.h>#include <string.h>

id i ( id)void main (void){

char direccion [50];int caracter = ‘M’; /* Carácter 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 carácter %c está en l d % \ ” * t di i )

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 19

la cadena %s\n”,*punt,direccion);else

fprintf (stdout,“El caracter %c no se ha encontrado.\n”,caracter);

}

Funciones de cadenas de caracteresFunciones de cadenas de caracteresstrtok

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

B l i i t d li it d t D li itBusca el siguiente delimitador strDelimit 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 en la que se

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 20

una palabra de la cadena strToken, en la que se consideran como delimitadores de palabra los especificados en strDelimit.•Cuando no se encuentran más palabras, devuelve un puntero a NULL.

Page 11: Cadenas de Caracteres

11

Funciones de cadenas de caracteresFunciones de cadenas de caracteresEjemplo - strtok :

#include <stdio.h>#include <string.h>

la primera vez se pasa la cadena y el

void main (void){

char *cad = “Prueba, cadena-pequeña- con separadores, varios.fin”;

char *palabra;

palabra = strtok (cad, “ ,.-”);

while (palabra != NULL){

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 21

pasa la cadena y el resto el valor NULLfprintf (stdout,“%s\n”,palabra);

palabra = strtok (NULL, “ ,.-”);}

}

Funciones de cadenas de caracteresFunciones de cadenas de caracteres

Ejercicio propuesto :Presentar un mensaje por pantalla indicando si una secuencia de 10 caracteres es palíndromo.

U i d t lí d i l i l Una secuencia de caracteres es palíndromo si se lee igual de derecha a izquierda que de izquierda a derecha.

Mirar si es palíndromo

INICIOMientras principio < final y

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 22

sean iguales los elementos del array de índices principio y final hacer

principio <- siguiente(principio+1)final<-anterior(final-1)

finMientrasFIN

Page 12: Cadenas de Caracteres

12

Funciones de cadenas de caracteresFunciones de cadenas de caracteres#include <stdio.h>#define LONGITUD 10

void main (void){char secuencia[LONGITUD+1]; /* palabra a analizar */int principio = 0;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;

}

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 23

}if (palin)

fprintf(stdout,“Es una secuencia palíndromo);else

fprintf(stdout,“No es una secuencia palíndromo);}

EjercicioEjercicio

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

Curso 06/07

Programación I: Estructuras de datos. Tema 5 - 24