Subido por chav8474

Tema 7 - Strings

Anuncio
Tema 7
Estructuras de datos: las
cadenas de caracteres (strings)
Cadenas de caracteres

Son estructuras idénticas a los tablas numéricas,
con la diferencia de que almacenan caracteres
 Todo
lo visto para los arrays sirve para los strings
 No obstante, los strings presentan peculiaridades que
veremos a continuación (y que no son aplicables a las
tablas numéricas)
2
Strings

Al representarlos se delimitan por comillas (“ ”).
 “hola

mundo”
Contienen un carácter adicional (‘\0’) al final de
la cadena para señalar el final de la misma
 No
necesariamente corresponde con el final físico (es
decir, la última posición definida para el string)
0
1
2
3
4
5
6
7
8
9
10
‘h’ ‘o’ ‘l’ ‘a’ ‘ ’ ‘m’ ‘u’ ‘n’ ‘d’ ‘o’ ‘\0’
11 12 ...
?
? ...
3
Definición de strings
char nombre_cadena[numero_caracteres + 1];

Ejemplo
#define N 51
int main( void)
{
char cadena[N];
....
}
4
Carga de elementos

En el caso de los arrays se hace con un bucle
 Con
los strings se puede hacer igual
do
{
printf(“\nDame un caracter: ”);
fflush(stdin);
scanf(“%c”, &cadena[i]);
i = i+1;
printf (“\nMas caracteres? (s/n)”);
fflush(stdin);
scanf(“%c”, &resp);
} while (resp ==‘s’ && i < N-1);
cadena[i] = ‘\0’;
5
Carga de elementos

Lo mejor es hacerlo con una sola instrucción
 scanf(“%s”,
cadena); /* sin & */
 Captura los caracteres hasta espacio, tabulador o intro
 gets(cadena);
 Captura los caracteres tecleados hasta intro
 En
ambos casos se añade automáticamente el ‘\0’
6
#include <string.h>

Será necesario añadir esta línea cuando vayamos
a trabajar con strings
 En
concreto, para usar las funciones gets y strlen
7
Escritura de elementos

También se puede hacer de dos formas
 Carácter
a carácter en bucle: printf(“%c”,cadena[i]);
 Todo de una vez: printf(“%s”, cadena);
 En este caso se escribe hasta el carácter ‘\0’ (no incluido)
8
Ejemplo

Programa que lee una cadena y la rescribe
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 51
int main(void)
{
char cadena[N];
printf("Escribe algo:");
fflush(stdin);
gets(cadena);
printf("\nLo que has escrito es: %s", cadena);
printf("\n\n");
system("pause");
}
9
Ejercicio para hacer ahora

Función que recibe como parámetro una cadena
de caracteres y devuelve el número de caracteres
“válidos” que contiene
 Es
decir, cuántos caracteres hay antes del ‘\0’
En este ejemplo: 10
0
1
2
3
4
5
6
7
8
9
10
‘h’ ‘o’ ‘l’ ‘a’ ‘ ’ ‘m’ ‘u’ ‘n’ ‘d’ ‘o’ ‘\0’
11 12 ...
?
? ...
10
La función strlen

Esta función recibe un string y devuelve la
posición en la que se encuentra el carácter ‘\0’
O
lo que es lo mismo, el número de caracteres
“válidos” de la cadena
11
Ejemplo

Programa que lee un string y lo rescribe al revés
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
int main(void)
{
char cadena[N]; int longi, i;
printf(“Escribe algo...”);
fflush(stdin);
gets(cadena);
longi = strlen(cadena);
printf(“Tu cadena al reves es: ”);
for (i= longi-1; i>=0; i= i-1)
{ printf(“%c”, cadena[i]); }
system(“pause”);
}
12
Otras funciones interesantes

void strcpy (char destino[], char origen[])
 Copia

la cadena origen en la cadena destino.
void strcat (char cadena1[], char cadena2[])
 Concatena
cadena1 y cadena2 y deja el resultado en
cadena1.

int strcmp(char cadena1[], char cadena2[])
 Devuelve
0 si ambas cadenas son iguales y algo
distinto de 0 en caso contrario
13
El dato de tipo carácter
En el ordenador cada carácter se representa con
un número
 Por tanto podemos aplicar operaciones
numéricas a los caracteres:

 Dado
un carácter (char car)
 Es una letra mayúscula si: car>=‘A’ && car<=‘Z’
 Es una letra minúscula si car>=‘a’ && car<=‘z’
 La letra siguiente a car sería car+1
o ‘B’+1→ ‘C’
14
El dato de tipo carácter

Para pasar un carácter de mayúscula a minúscula hay dos
opciones:



Para pasar un carácter de minúscula a mayúscula



car_minuscula = car_mayuscula + 32;
Usar la función tolower: car_minuscula = tolower(car_mayuscula)
car_mayuscula = car_minuscula – 32;
Usar la función toupper: car_mayuscula = toupper(car_minuscula)
¡Ojo!


Las funciones toupper y tolower se aplican a caracteres
sueltos, no a strings completos
Para poder usar toupper/tolower: #include <ctype.h>
15
16
Ejercicios propuestos (I)
1.- Leer una cadena de no más de 100 caracteres y
contar el número de apariciones de la sílaba
“la”
2.- Leer una cadena compuesta sólo por letras y
blancos y mostrar las iniciales de cada palabra

Al principio, al final, y entre palabras puede haber
más de un blanco
17
Ejercicios propuestos (II)
3.- Leer dos cadenas de 50 caracteres y decidir si
son iguales (1) o no (0)
4.- Leer dos cadenas de no más de 40 caracteres
cada una y obtener otra (de tamaño máximo
79) con la concatenación de ambas
5.- Leer una cadena y luego dos caracteres (car1 y
car2). Sustituir las apariciones de car1 por car2
18
Ejercicios propuestos (III)
6.- Función que recibe un string s y un carácter c, y elimina
las apariciones de c en s (desplazando a la izquierda)
7.- Función que decide si un string contiene todas las
vocales
8.- Función que codifica un string de modo que cada vocal
se sustituye por la siguiente letra del abecedario, y cada
consonante por la anterior (si no es letra, se queda igual)
19
Ejercicios propuestos (y IV)
9.- Función que recibe dos strings y devuelve:
 Si
el primero se encuentra dentro del segundo, la
posición a partir de la que coinciden
 Si no, el valor -1
10.- Función que recibe dos cadenas de caracteres y
decide si una es permutación de la otra
20
Descargar