Professional Documents
Culture Documents
Introduccin
Los datos con los que se ha trabajado hasta el momento son numricos y con ellos, se ha
realizado todo tipo de clculos y comparaciones; con los datos alfanumricos slo se han
realizado operaciones de lectura y escritura, ya que los datos alfanumricos no se pueden
operar de la misma forma.
Dos nombres no se pueden sumar o multiplicar, pero s se puede agregar un dato alfanumrico
a otro del mismo tipo, o se puede contar cuntas veces aparece una letra en una frase o texto
determinado. Para ello, se estudiaran las funciones propias de C que permiten manejar datos
alfanumricos.
4.1 Concepto
Una CADENA, o string, es un dato alfanumrico que est formado por un grupo de caracteres
que tiene un valor o contenido especial. Por caracter se debe entender una letra, un nmero o
un signo, incluso un espacio en blanco. Se puede decir que, cada smbolo del cdigo ASCII es
un caracter y se sabe que este cdigo est formado por 255 caracteres diferentes.
Un solo caracter se escribe siempre dentro de comillas simples y una cadena dentro de comillas
dobles. Por ejemplo:
Caracteres:
Cadena:
Pedro Ramirez
RL07001
2274-4578
Buenos Das
<
El lenguaje de programacin C, no tiene un tipo de dato predefinido para las cadenas, el tipo
que maneja es char y las variables que se declaran con ste, pueden almacenar un solo
carcter. Las cadenas o strings se manejan en C, como arreglos de tipo char y en cada
posicin del mismo se almacena un carcter, por lo tanto una cadena es considerada en C
como un vector tipo char. Por ejemplo, el vector de caracteres siguiente:
0 1
2
3 4
5 6
7
8
9 10 11 12
P E d
r
o
R a
m i
r
e
z
Se declarara en C as: char Nom[14] = Pedro Ramirez
Nom
13
\0
Los datos alfanumricos (o strings) son conocidos tambin como constantes de cadenas o
literales de cadena. Son arreglos tipo char, con un carcter ms en su dimensin, para el
caracter \0. Este lenguaje de programacin siempre agrega el carcter nulo (\0) al final de la
cadena, por lo que hay que considerar este espacio a la hora de declarar el arreglo:
char cad[4] = ABC;//El arreglo cad, tiene 4 elementos, el ltimo es \0
//cad puede almacenar hasta 3 caracteres
La lectura normalmente se realiza con la funcin scanf, siendo el formato de tipo de dato %s,
y no necesita el smbolo &. Ejemplo: scanf(%s, cad);// Lee la cadena cad
Esta funcin da por terminada la cadena (o dato a leer) cuando encuentra un espacio en blanco
o el fin de lnea (al presionar enter), para poder leer ms de una palabra en una cadena, se
utiliza el formato [^\n]. Ejemplo: scanf(%[^\n]s, nom);//Lee mas de una palabra
Adems se pueden utilizar las funciones: gets, lee todos los caracteres digitados hasta que
encuentra el fin de lnea (al presionar enter); getchar, getch, getche, para leer un solo
carcter. Por ejemplo:
//Utilizando Funcion gets
#include <stdio.h>
#include <conio.h>
main() {
char nombre[30];
puts ("Nombre: ");
gets(nombre);
printf("%s",nombre);
getch();
}
En resumen:
Instruccin en C
...
Si al ejecutar, se digita:
En memoria:
Raul
char nom[ ];
...
char nom[ ];
...
char nom[ ];
gets (nom);
Las cadenas se pueden imprimir con las funciones: printf, utilizando como formato de tipo de
datos %s; puts, que imprime un string; y putchar, para imprimir un solo carcter:
Instruccin en C
...
Si en memoria se tiene:
Raul Antonio Fernandez
Impresin:
Raul Antonio Fernandez
char nom[ ];
...
char nom[ ];
puts(nom);
La lectura y escritura de cadenas desde consola (teclado y pantalla), tambin puede realizarse
como se muestra a continuacin:
leer cin >> nombre del array que recibe la cadena:
cin >> texto;
escribir cout << nombre del array que contiene la cadena:
cout << texto;
Esta manera, presenta el inconveniente que cin no hace comprobacin de lmites, de manera
que es posible que el usuario introduzca ms caracteres que los que pueda almacenar la
cadena. Adems, si se intenta introducir desde teclado la cadena Esto es un prueba, C deja
de leer cuando encuentra el primer espacio en blanco y por lo tanto slo habr almacenado:
Esto. Para solucionarlo se utiliza la funcin de biblioteca gets() que lee una cadena del teclado
hasta que se pulsa intro, el formato general de gets es:
gets(nombreArray);
El cdigo asociado sera:
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
main ()
{
char Texto[20];
gets(Texto);
cout << Texto;
getch();
}
SALIDA EN PANTALLA:
Rosa Lidia Cruz
Rosa Lidia Cruz
RECORDAR QUE: Las cadenas no se asignan como el resto de las variables:
Texto = Hola; // Es un error
Repitiendo, para declarar una cadena se hace como en el caso de un array. Por ejemplo, si se
quiere declarar una cadena de longitud 20 caracteres se escribira: char Texto[20];
Al igual que en los arrays, no se pueden introducir ms de 20 elementos en la cadena. Estudiar
el siguiente cdigo para mostrar el nombre del usuario en pantalla:
#include <stdio.h>
main()
{
char nombre[50];
printf( "Introduzca su nombre (50 letras maximo): " );
scanf( "%s", nombre );
printf( "\nEl nombre que ha escrito es: %s\n", nombre );
}
//Salida en pantalla:
//Introduzca su nombre (50 letras maximo): Rosa Lidia Cruz
//El nombre que ha escrito es: Rosa
Es interesante saber cmo funciona una cadena por dentro, por eso se va a repasar cmo se
inicializa:
#include <stdio.h>
//Salida en pantalla:
#include <conio.h>
//Texto: Gandalf
main()
//La cadena ocupa 8 bytes
{
char nombre[] = "Gandalf";
printf( "Texto: %s\n", nombre );
printf( "La cadena ocupa: %i bytes\n", sizeof nombre );
getch();
}
El operador sizeof informa del tamao del almacenamiento utilizado por cualquier objeto, sea
un tipo bsico o derivado. El operador unitario sizeof tiene dos formas posibles de sintaxis:
sizeof expresin-unitaria
sizeof (nombre-de-tipo)
Tomar en cuenta que a pesar del aspecto de la segunda forma de sintaxis, se trata de un operador, no de
una funcin. sizeof representa una forma cmoda de obtener informacin sobre el tamao de los tipos
bsicos. Cualquiera que sea la forma de sintaxis empleada, el resultado es una constante entera de tipo
size_t, con el espacio de memoria (bytes) usada por el operando. Con algunas excepciones, este tamao
es determinado por el tipo de operando, y para cada tipo, depende de la implementacin:
#include <conio.h>
//Salida en pantalla:
#include <iostream.h>
//Tamano de ld: 12
int main(void)
//Long double = 12 Bytes
{
long double ld;
cout << "Tamano de ld: " << sizeof ld << endl;
cout << "Long double = " << sizeof(long double) << " Bytes" << endl;
getch();
return 0;
}
Para poder trabajar (manejar o modificar) cadenas de caracteres, es necesario utilizar funciones
propias de C que se encuentran en las libreras del compilador, algunas de stas son:
a) string.h, funciones necesarias para manipular o trabajar con cadenas.
b) ctype.h, funciones para verificacin de tipos de datos y conversin de letras minsculas
a maysculas (y viceversa).
c) stdlib.h, funciones para convertir datos alfanumricos en datos numricos, si es posible.
strlen(cad)
getch(); }
//Salida:
//La cadena "Gandalf" tiene 7 caracteres.
#include <iostream.h>
strlen(cad)
strcat(cad1,cad2)
strncat(cad1,cad2,n)
strcpy(cad1,cad2)
#include <string.h>
#include <conio.h>
main ()
{
char texto[15] = "Hola y adios";
int longitud = 0;
longitud = strlen (texto);
cout << longitud;
getch();
}
//Salida: 12
#include
#include
#include
//Cadena
main()
{
<stdio.h>
<string.h>
<conio.h>
1 (destino) constante
strcpy(cad1,cad2)
#include <stdio.h>
#include <string.h>
#include <conio.h>
main()
{
char nombreCompleto[50];
char nombre[]="Gandalf";
char apellido[]="El Gris";
strcpy( nombreCompleto, nombre );
strcat( nombreCompleto, " " );
strcat( nombreCompleto, apellido );
printf( "El nombre completo es: %s.\n",
nombreCompleto );
getch();
}
//Salida:
//El nombre completo es: Gandalf El Gris.
#include <conio.h>
#include <iostream.h>
#include <string.h>
main ()
{ char texto_origen[75] = "Hola y adios";
char texto_destino[25] ;
strcpy (texto_destino, texto_origen);
cout << texto_destino;
getch();
} //Salida: Hola y adios
strncpy(cad1,cad2,n)
strcmp(cad1,cad2)
#include <conio.h>
#include <iostream.h>
#include <string.h>
main ()
{ char texto_1[75] = "Hola y adios";
char texto_2[25] = "hola y adios";
int resultado;
resultado = strcmp (texto_1, texto_2);
cout << resultado;
getch();
} //Salida: -1
#include <conio.h>
#include <iostream.h>
#include <string.h>
main ()
{ char texto_1[75] = "Hola y adios";
char texto_2[25] = "hola y adios";
int resultado;
resultado = strcmp (texto_2, texto_1);
cout << resultado;
getch();
} //Salida: 1
strcmp(cad1,cad2)
#include <conio.h>
#include <iostream.h>
#include <string.h>
main ()
{ char texto_1[75] = "Hola y adios";
char texto_2[25] = "Hola y adios";
int resultado;
resultado = strcmp (texto_2, texto_1);
cout << resultado;
getch();
} //Salida: 0
#include <stdio.h>
#include <string.h>
#include <conio.h>
main()
{
char n1[]="Gandalf";
char n2[]="Frodo";
printf( "Comparacion con strcmp: %i\n", strcmp(n1,n2));
getch();
}
//Salida: Comparacion con strcmp: 1
strcmpi(cad1, cad2)
strncmp(cad1,cad2, n)
strnicmp(cad1,cad2,n)
stricmp(cad1,cad2)
strrev(cad)
strlwr(cad)
strupr(cad)
En resumen, cada vez que necesite identificar el tipo de tecla que ha pulsado el usuario, se
pueden utilizar las macros de clasificacin.
Asimismo, existen otras funciones en el archivo ctype.h que sirven para convertir caracteres en
maysculas a minsculas, y viceversa; y valores enteros en cdigos ASCII.
isalnum(carac)
isalpha(carac)
isascii(carac)
isdigit(carac)
islower(carac)
isupper(carac)
10
tolower(carac)
Existen unas cuantas funciones para convertir cadenas a enteros, enteros largos y valores
flotantes. Estas son:
atoi(cad)
[espacio en blanco]
[signo]
Puede ser + o -
[ddd]
Cadena de dgitos.
11
atof(cad)
atol(cad)
12
. . .
int area;
char cad[81];
. . .
printf(\n Area de la Finca: \t);
gets(cad);
area=atoi(cad);
printf(\n Nombre de la Finca: );
gets(cad);
. . .
A continuacin, se presenta un ejemplo donde se utilizan varias funciones de conversin de
datos:
#include
#include
#include
#include
<math.h>
<stdlib.h>
<stdio.h>
<conio.h>
main()
{
int i;
float f;
char cad1[] = "100";
char cad2[] = "55.444";
char cad3[] = "
1234";
char cad4[] = "123cuatro";
char cad5[] = "invalido123";
char cad6[] = "123E23Hola";
char cad7[10];
i = atoi(cad1);
// i = 100
printf(" i es %i\n", i);
f = atof(cad2);
// f = 55.44
printf(" f es %.2f\n", f);
i = atoi(cad3);
// i = 1234
printf(" i es %i\n", i);
i = atoi(cad4);
// i = 123
printf(" i es %i\n", i);
i = atoi(cad5);
// i = 0
printf(" i es %i\n", i);
i = atoi(cad6);
// i = 123
printf(" i es %i", i);
getch();
}
13
4.5 Ejemplos
Ejemplo 1: Disear un programa que forme una cadena a partir de tres cadenas diferentes; las
cadenas originales no se deben alterar, y se van a unir en el siguiente orden: cadena 1, cadena 2 ,
cadena 3, y debe agregarse 3 caracteres iniciales de la cadena 2; se debe incluir una coma y un
espacio (, ) entre cadena y cadena. Se debe imprimir el nmero de caracteres que contiene la
nueva cadena y la cadena en maysculas.
Salida de datos
Cadenas de caracteres
originales (3)
II. Anlisis del Problema:
a) Variables de Salida:
Nombre
Tipo
frase4[100]
Alfanumrico
Descripcin
Cadena formada por 3 cadenas diferentes, se le asigna
el carcter nulo (\0)
b) Variables de Entrada:
Nombre
Tipo
Descripcin
frase1 [20]
Alfanumrico Representa la primera cadena, se inicializa con hola
frase2[20]
Alfanumrico Representa la segunda cadena, se inicializa con buenos dias
frase3[ ]
Alfanumrico Representa la tercera cadena, se inicializa con adios
c) Restricciones: No existen, las cadenas pueden estar formadas por cualquier tipo de
caracteres, pero deben ser frase1 de 19, frase2 de 19, frase4 de 99 caracteres como mximo;
frase3 tendr tantos caracteres como se le asignen al inicio.
d) Proceso: Se van a unir las tres cadenas, una despus de la otra (frase1+frase2+frase3),
esto se logra con la funcin de contatenar: strcat y, para no afectar ninguna de las 3 cadenas
iniciales, se concatenarn una a una a la cuarta cadena, que inicialmente est vaca (\0):
frase4 = frase4 + frase1
//strcat(frase4,frase1)
frase4 = frase4 + una coma y un espacio
frase4 = frase4 + frase2
frase4 = frase4 + una coma y un espacio
frase4 = frase4 + frase3
frase4 = frase4 + una coma y un espacio
frase4 = frase4 + los 3 caracteres iniciales de frase2
//strncat(frase4, frase2, 3)
Se van a ir imprimiendo los cambios de frase4 para que se note la unin de las cadenas
e) Variables de Proceso: No existen
III. Diseo de Solucin: El flujograma se omite, ya que son acciones secuenciales.
14
IV. Codificacin:
//Une tres frases en una sola, y les agrega puntuacin
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{
char frase1[20] = "hola";
char frase2[20] = "buenos dias";
char frase3[ ]
= "adios";
char frase4[100] = "\0";
strcat(frase4, frase1);
puts(frase4);
strcat(frase4, ", ");
puts(frase4);
strcat(frase4, frase2);
puts(frase4);
strcat(frase4, ", ");
strcat(frase4, frase3);
//Agrega 3 caracteres de frase2 a frase4
strncat(frase4, frase2,3);
puts(frase4);
printf("\n\n\n La nueva cadena
Cadena de caracteres
Salida de datos
15
Descripcin
Nmero de palabras que tiene la frase leda
Nmero de vocales a que hay en la frase
Nmero de vocales e que hay en la frase
Nmero de vocales i que hay en la frase
Nmero de vocales o que hay en la frase
Nmero de vocales u que hay en la frase
b) Variables de Entrada:
Nombre
frase1[100]
Tipo
Descripcin
Alfanumrico Representa la cadena o frase inicial,
c) Restricciones: No existen.
d) Proceso:
Para contar las palabras de una frase (por ejemplo la casa es bonita), se debe observar que
entre dos palabras siempre hay un espacio en blanco; por lo tanto si se cuentan los espacios en
blanco que tiene una cadena, se sabe el nmero de palabras que sta tiene.
Se necesita un contador de palabras: pal (inicialmente con valor cero) y, un ciclo que compare
desde el primer carcter de la frase ( 0 ) hasta el ltimo (strlen(frase)) con un espacio en blanco.
Recordar que una cadena de caracteres, es un vector, por lo tanto se puede manejar carcter
por carcter, con subndices:
pal=0
i = 0, strlen(frase), 1
frase[ i ] == ?
Si: pal++
Notar que la ltima palabra de la frase (bonita para el ejemplo) NO tiene espacio en blanco,
por lo que para imprimir pal, se le debe agregar uno.
De la misma forma, se contarn cada una de las vocales que existen en la frase en cuestin; es
decir recorriendo la cadena desde el primer carcter hasta el ltimo, buscando en cada uno
letras vocales, maysculas o minsculas:
va=0;
i=0, strlen(frase)
ve=0;
vi=0;
frase[ i ] =
A
E
I
O
U
vo=0;
o
o
o
o
o
a
e
i
o
u
vu=0;
va++
ve++
vi++
vo++
vu++
16
e) Variables de Proceso:
Nombre
Tipo
i
Entero
Descripcin
Representa el ndice para desplazarse carcter por carcter en
la cadena o frase inicial; V. inicial=0 V. cambio =1 y V. final =
nmero de caracteres de la cadena (strlen(frase))
printf("\n\n
printf("\n\n
printf("\n\n
printf("\n\n
printf("\n\n
getch();
return 0;}
Numero
Numero
Numero
Numero
Numero
de
de
de
de
de
letras
letras
letras
letras
letras
a:\t%i",
e:\t%i",
i:\t%i",
o:\t%i",
u:\t%i",
va);
ve);
vi);
vo);
vu);
17
Ejemplo 3: Disear un programa que pase las dos primeras palabras la final de una cadena. Se debe
trabajar con una cadena de varias palabras y la cadena inicial no debe ser modificada. Por ejemplo si la
frase es: Oscar Rene Pleitez Marroquin El resultado debe ser: Pleitez Marroquin Oscar Rene
Salida de datos
Cadena de caracteres
Alfanumrica
Descripcin
Cadena formada con las dos primeras palabras de la
cadena original (cad).
Cadena resultante, con las primeras dos palabras
invertidas
//longitud de la cadena
//contador de palabras
cad[ i ] == ?
Si: pal++
i=0,x,1
pal==2?
Si: y = i
Ahora, se copian los y primeros caracteres de cad en aux: strncpy(aux, cad, y);
18
Por ltimo, se une aux1 con aux y se obtiene la nueva cadena con: strcat(aux1, aux)
e) Variables de Proceso:
Nombre
x
Tipo
Entero
Entero
pal
y
Entero
Entero
Entero
Descripcin
Almacena el nmero de caracteres de la cadena inicial
(strlen(cad))
Representa el ndice para desplazarse carcter por carcter en
la cadena o frase inicial, cad; V. inicial=0 V. cambio =1 y V.
final = x
Nmero de palabras que tiene la cadena o frase leda (cad).
Almacena el nmero de caracteres de las primeras dos
palabras de la cadena inicial (strlen(aux))
Almacena el nmero de caracteres de las restantes palabras de
la cadena inicial. De la tercera en adelante: x-y
19
puts(aux1);
strrev(aux1);
printf("\n\nImpresion de la Tercera palabra en adelante, al derecho:\n");
puts(aux1);
strcat(aux1," ");
strcat(aux1,aux);
printf("\n\nCadena Resultante:\n");
puts(aux1);
getch();
return 0;
}
20
21
Salida en pantalla:
22