cadenas de caracteres
Post on 03-Feb-2016
212 Views
Preview:
DESCRIPTION
TRANSCRIPT
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.
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
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]);
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
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.
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.
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 ;}
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.
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.
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.
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
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
top related