Este documento trata sobre cadenas en C. Explica cómo se representan las cadenas en C como arreglos unidimensionales de caracteres terminados por un carácter nulo. También cubre temas como la lectura de cadenas desde el teclado, las bibliotecas estándar ctype.h y string.h para la manipulación de cadenas, y la conversión de tipos entre cadenas y otros tipos de datos en C. Finalmente, incluye algunos ejercicios de práctica sobre estos temas.
Falla de san andres y el gran cañon : enfoque integral
Cadenas C programación
1. Programación 1
Cadenas en C
Angel Vázquez-Patiño
angel.vazquezp@ucuenca.edu.ec
Departamento de Ciencias de la Computación
Universidad de Cuenca
19 de septiembre de 2017
2. 19/09/17 Angel Vázquez-Patiño 2/59
Objetivos
1. Manipular caracteres y cadenas en C
2. Utilizar librerías estándar de C para la
manipulación de caracteres y cadenas
3. Usar punteros para el manejo de cadenas y
caracteres en C
4. Convertir tipos de datos en C
3. 19/09/17 Angel Vázquez-Patiño 3/59
Contenido
Cadenas en C
Lectura de una cadena desde el teclado
Bibliotecas estándar
ctype.h
string.h
Conversión de tipos
Ejercicios
5. 19/09/17 Angel Vázquez-Patiño 5/59
Cadenas en C
●
Las cadenas son realmente un arreglo
unidimensional de caracteres terminados por
un carácter nulo ‘0’
●
Así una cadena terminada en nulo contiene los
caracteres que comprenden la cadena
seguidos por un null
6. 19/09/17 Angel Vázquez-Patiño 6/59
Cadenas en C
Declaración e inicialización de cadena “Hola”
●
Por el carácter nulo al final se reserva un
elemento más en el arreglo
char cad[5] = {‘H’,’o’,’l’,’a’,’0’};
●
Siguiendo la regla de inicialización de arreglos
char cad[] = “Hola”;
12. 19/09/17 Angel Vázquez-Patiño 12/59
Leer una cadena desde el teclado
1 int main(){
2 char nombre[50];
3 printf("Ingrese su nombre
completo (50 letras máximo):
");
4 scanf("%s", nombre);
5 printf("Nombre: %s", nombre);
6 }
13. 19/09/17 Angel Vázquez-Patiño 13/59
Leer una cadena desde el teclado
1 int main(){
2 char nombre[50];
3 printf("Ingrese su nombre
completo (50 letras máximo): ");
4 scanf("%49[0-9a-zA-z ]",
nombre);
5 printf("Nombre: %s", nombre);
6 }
14. 19/09/17 Angel Vázquez-Patiño 14/59
Leer una cadena desde el teclado
1 int main(){
2 char nombre[50];
3 printf("Ingrese su nombre
completo (50 letras máximo):
");
4 scanf("%[^n]s", nombre);
5 printf("Nombre: %s", nombre);
6 }
15. 19/09/17 Angel Vázquez-Patiño 15/59
Leer una cadena desde el teclado
1 #include<stdio.h>
2 int main(){
3 char nombre[50];
4 printf("Ingrese su nombre completo
(50 letras máximo): ");
5 gets(nombre); // warning: the
`gets' function is dangerous and
should not be used.
6 printf("Nombre: %s", nombre);}
16. 19/09/17 Angel Vázquez-Patiño 16/59
Leer una cadena desde el teclado
1 #include<stdio.h>
2 int main(){
3 char nombre[50];
4 printf("Ingrese su nombre completo
(50 letras máximo): ");
5 fgets(nombre, 50, stdin);
6 printf("Nombre: %s", nombre);}
Vea https://goo.gl/VE5N1D
17. 19/09/17 Angel Vázquez-Patiño 17/59
Ejercicios
Ejercicio
●
Escribir una función que reciba como
parámetros una cadena de caracteres y un
carácter; la función devuelve el número de
veces que se encuentra el carácter en la
cadena
23. 19/09/17 Angel Vázquez-Patiño 23/59
ctype.h
int isalpha(int c)
● Verifica si el caracter c es alfabético
int isdigit(int c)
● Verifica si el caracter c es dígito decimal
int tolower(int c)
● Convierte el carácter c a minúscula
int toupper(int c)
● Convierte el carácter c a mayúscula
29. 19/09/17 Angel Vázquez-Patiño 29/59
ctype.h
Ejercicio 3
●
Implemente una función que reciba una cadena
y una letra, y coloque en mayúsculas cada
ocurrencia de la letra (case sensitive) en la
cadena (la función debe modificar la cadena en
sí).
32. 19/09/17 Angel Vázquez-Patiño 32/59
string.h
Vea los vídeos
Aprende Programación en C || Programación ATS
1) https://youtu.be/YqoV6UMQEcE
2) https://youtu.be/iW_zzg2ppvg
3) https://youtu.be/_uk3pSfTpUE
4) https://youtu.be/k2Bm1rc4LGY
5) https://youtu.be/1uBfk0Gn0io
6) https://youtu.be/qbBG8rjpOW4
33. 19/09/17 Angel Vázquez-Patiño 33/59
string.h
char *strcpy(char *dest, const char
*src)
● Copia la cadena apuntada por src a dest
char *strcat(char *dest, const char
*src)
● Concatena la cadenas apuntada por src al final
de la cadena apuntada por dest
size_t strlen(const char *str)
● Calcula la longitud de la cadena str sin incluir el
carácter nulo de terminación
34. 19/09/17 Angel Vázquez-Patiño 34/59
string.h
int strcmp(const char *str1, const
char *str2)
●
0 si str1 = str2; <0 si str1 < str2; >0 si str1 > str2
char *strchr(const char *str, int c)
● Busca la primera ocurrencia del carácter c (un
unsigned char) en la cadena apuntada por el
argumento str
35. 19/09/17 Angel Vázquez-Patiño 35/59
string.h
char *strstr(const char *haystack,
const char *needle)
●
Encuentra la primera ocurrencia de la cadena
needle completa (sin incluir el carácter nulo de
terminación) que aparece en la cadena
haystack
char *strtok(char *str, const char
*delim)
● Separa la cadena str en una serie de tokens
separados por delim
36. 19/09/17 Angel Vázquez-Patiño 36/59
#include <stdio.h>
#include <string.h>
int main (){
char cad1[] = "Hola ";
char cad2[] = "Mundo"; char cad3[2];
strcpy(cad3, cad1); // copia cad1 en cad3
printf("strcpy(cad3, cad1): %sn", cad3);
strcat(cad1, cad2); // concatena
printf("strcat(cad1, cad2): %sn", cad1);
// Longitud cad1 después de concatenación
printf("strlen(cad1):%d", strlen(cad1));}
38. 19/09/17 Angel Vázquez-Patiño 38/59
string.h
Ver si una cadena está dentro de otra
1 int main(){
2 char cad[100], subcad[100];
3 scanf("%[^n]s", cad);
4 scanf("%[^n]s", subcad);
5 if(strstr(cad, subcad) != NULL)
6 printf("Sí contiene.");
7 else
8 printf("No contiene.");}
39. 19/09/17 Angel Vázquez-Patiño 39/59
string.h
Posición de la primera ocurrencia de una
subcadena
1 int main(){
2 char a[] = "Hola mundo";
3 char *b = strstr(a, "mundo");
4 printf("b: %pn*b: %cn", b, *b);
5 printf("na: %pn*a: %cn", a, *a);
6 printf("nPosición: %i", (int)(b-
a));}
40. 19/09/17 Angel Vázquez-Patiño 40/59
string.h
Separar una cadena en tokens
1 int main(){
2 char str[60] = "Este es- mi curso - de C -en
la -- Universidad de Cuenca";
3 const char s[2] = "-"; char *token;
4 token = strtok(str, s);//obtiene el primer
token
5 while(token != NULL){ // va a través de
6 printf( " %sn", token ); // los otros
tokens
7 token = strtok(NULL, s);}
8 return(0);}
41. 19/09/17 Angel Vázquez-Patiño 41/59
string.h
Ejercicio
●
Solicitar el ingreso de los apellidos de dos
personas. Mostrar un mensaje indicando si son
iguales o distintos.
44. 19/09/17 Angel Vázquez-Patiño 44/59
Conversión de tipos
Cadena a entero
1 #include<stdio.h>
2 #include<stdlib.h> // para atoi
3 int main(){
4 char cadena[] = "48";
5 int num = atoi(cadena);
6 printf("%d", num*2);}
45. 19/09/17 Angel Vázquez-Patiño 45/59
Conversión de tipos
Cadena a float
1 #include<stdio.h>
2 #include<stdlib.h> // para atof
3 int main(){
4 char cadena[] = "48.098";
5 float num = atof(cadena);
6 printf("%f", num);}
46. 19/09/17 Angel Vázquez-Patiño 46/59
Conversión de tipos
Entero a cadena
1 #include<stdio.h> // sprintf
2 int main(){
3 int entero = 368;
4 char cad[4];
5 sprintf(cad, "%d", entero);
6 printf("%s", cad);}
47. 19/09/17 Angel Vázquez-Patiño 47/59
Conversión de tipos
Entero a cadena
● También puede revisar la función itoa
● itoa no es estándar
●
https://goo.gl/Cv7r7c
49. 19/09/17 Angel Vázquez-Patiño 49/59
Conversión de tipos
Ejercicio
●
Solicitar el ingreso, como cadenas, del nombre
y edad de dos personas (validar que sea una
edad correcta entre 0 y 130 años). Mostrar el
nombre de la persona con mayor edad.
52. 19/09/17 Angel Vázquez-Patiño 52/59
Ejercicios
1) Implemente la función _Bool equals(const
char *str1, const char *str2) que
devuelve true/false si las cadenas enviadas
como argumento son/(no son) iguales. Es case
sensitive
2) Implemente la función _Bool
equalsIgnoreCase(const char *str1,
const char *str2) que devuelve true/false
si las cadenas enviadas como argumento son/
(no son) iguales. Es no case sensitive.
53. 19/09/17 Angel Vázquez-Patiño 53/59
Ejercicios
3) Implemente la función void substring(char
*dest, const char *str, size_t pos)
que devuelve una subcadena dest desde la
posición pos hasta el final de la cadena str
4) Implemente la función void substring(char
*dest, const char *str, size_t pos1,
size_t pos2) que devuelve una subcadena
dest desde la posición pos1 hasta la posición
pos2 de la cadena str
54. 19/09/17 Angel Vázquez-Patiño 54/59
Ejercicios
5) Implemente la función size_t
lastIndexOf(const char *cad, const
char *subcad) que da la posición de la
primera ocurrencia de la subcadena subcad
comparando la ocurrencia de derecha a
izquierda en cad
56. 19/09/17 Angel Vázquez-Patiño 56/59
Conceptos y términos importantes
●
Maneras de leer cadenas desde el teclado
●
Una cadena es un arreglo de caracteres
●
Punteros
●
Uso de punteros en las funciones
●
Transformar caracteres o cadenas a números
57. 19/09/17 Angel Vázquez-Patiño 57/59
Referencias
●
Gustedt, J., 2017. Modern C. France.
http://icube-icps.unistra.fr/index.php/File:Moder
nC.pdf
●
C - Strings,
https://www.tutorialspoint.com/cprogramming/c_
strings.htm
●
How do you allow spaces to be entered using
scanf, https://goo.gl/UOk4e
●
C Standard Library Reference Tutorial,
https://www.tutorialspoint.com/c_standard_librar
y/
58. 19/09/17 Angel Vázquez-Patiño 58/59
Referencias
●
Trim a string in C, https://goo.gl/SvJKk
Revisar
●
Sección 6.1. Arrays del libro de Gustedt (2017)
●
Vázquez-Patiño, A., 2017. Ejercicios Básicos
de Programación, 1st ed. Departamento de
Ciencias de la Computación, Universidad de
Cuenca, Cuenca, Ecuador.
https://goo.gl/X0UTxi