You are on page 1of 22

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE INGENIERIA Y ARQUITECTURA


ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOS
PROGRAMACION I
Licda. Anglica Nuila de Snchez

UNIDAD IV. MANEJO DE CADENAS DE CARACTERES


Objetivo de la Unidad: Aprender a manipular datos alfanumricos y conocer las funciones
propias del Lenguaje de Programacin C para hacerlo.

Contenido de la Unidad: 4.1 Concepto


4.2 Funciones de Cadena
4.3 Funciones de Clasificacin
4.4 Funciones de Conversin
4.5 Ejemplos
4.6 Arreglos de Cadenas (Tpico Complementario Opcional)

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

<

Representa: Nombre de una persona


Carnet de un alumno
Nmero de telfono
Una frase que indica un saludo

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

Cuando aparece la cadena dentro de un programa, se almacena como si fueran 4 elementos de


tipo char: A , B, C y \0, los cuales pueden ser accesados uno por uno, por medio de sus
subndices: cad[0]=A;
cad[1]=B;
cad[2]=C;
cad[3]=\0; As, cuando se utiliza
printf o puts se copia en la pantalla, carcter por carcter hasta que aparece el carcter \0
Se puede dar valores iniciales a un vector tipo char, y es la nica vez que se realiza esta
operacin con el operador de asignacin =. Por ejemplo:
char frase[12] = Buenos Das;//No sobra espacio en la cadena frase
char t[255]=Puede ser una cadena bien larga;//Sobran 218 posiciones en t
char nom[ ]=Jose Carlos Morales;//Declara y llena un vector de 20 elementos

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();
}

//Con espacios en blanco incluidos


//Para observar cadena almacenada en memoria

//Utilizando Funcion scanf


#include <stdio.h>
#include <conio.h>
main() {
char nombre[30];
//Con espacios en blanco incluidos
puts ("Nombre: ");
scanf(%[^\n]s,nombre);
printf("%s",nombre);
//Para observar cadena almacenada en memoria
getch();
}

En resumen:

Instruccin en C

...

Si al ejecutar, se digita:

En memoria:

Raul Antonio Fernandez

Raul

Raul Antonio Fernandez

Raul Antonio Fernandez

Raul Antonio Fernandez

Raul Antonio Fernandez

char nom[ ];

scanf (%s, nom);

...
char nom[ ];

scanf (%[^\n]s, 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[ ];

printf(%s \n, nom );

...

Raul Antonio Fernandez

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.

4.2 Funciones de Cadena: Librera <string.h>


Las funciones para cadenas de caracteres slo trabajan con conjuntos de caracteres ASCII o
extensiones ASCII compatibles.

strlen(cad)

Devuelve la longitud de una string, cad, o nmero de caracteres


que forman la cadena; el carcter nulo no forma parte de la
longitud. Ejemplos:
#include <stdio.h>
#include <string.h>
#include <conio.h>
main() {
char texto[]="Gandalf";
int len;
len = strlen(texto);
printf( "La cadena \"%s\" tiene %i caracteres.\n", texto, len);

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

Concatena o aade la cad2 al final de la cad1, devuelve la nueva


cad1. La longitud de cad1 debe ser suficientemente grande para
que albergue ambas cadenas. Ejemplo:
#include <conio.h>
#include <iostream.h>
#include <string.h>
main ()
{ char texto_1[75] = "Hola ";
char texto_2[25] = "y adios";
strcat (texto_1, texto_2);
cout << texto_1;
getch();
} //Salida: Hola y adios

Concatena los n primeros caracteres de cad2 a cad1, devuelve la


nueva cad1. Cad1 debe tener espacio para recibir los n
caracteres de cad2.
Copia cad2 en cad1, devuelve cad1. Sirve para asignarle
valores a una cadena. cad1 debe tener espacio suficiente para
almacenar cad2. Ejemplos:
#include <stdio.h>
#include <string.h>
#include <conio.h>
//Cadena 1 (destino) variable
main()
{
char texto[] = "Este es un Curso de C";
char destino[50];
strcpy( destino, texto );
printf( "Valor final: %s\n", destino );
getch();
}
//Salida:
//Valor final: Este es un Curso de C

#include
#include
#include
//Cadena
main()
{

<stdio.h>
<string.h>
<conio.h>
1 (destino) constante

char destino[50]="Este no es un Curso de HTML, sino de C";

printf( "%s\n", destino );


strcpy( destino, "Este es un Curso de C" );
printf( "%s\n", destino );
getch();
}
//Salida:
//Este no es un Curso de HTML, sino de C
//Este es un Curso de C

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)

Copia los n primeros caracteres de cad2 en cad1.

strcmp(cad1,cad2)

Compara las dos cadenas, devuelve un nmero entero, con un


valor:
> 0 si cad1 > cad2
= 0 si cad1 = cad2
< 0 si cad1 < cas2
Ejemplos:

#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)

Compara las dos cadenas sin diferenciar letras maysculas o


minsculas. Los resultados son los mismos que strcmp( )
Compara un nmero n de caracteres de las 2 cadenas,
devolviendo un entero igual que strcmp( ).

strnicmp(cad1,cad2,n)

stricmp(cad1,cad2)

strrev(cad)

strlwr(cad)
strupr(cad)

Compara los n primeros caracteres de las 2 cadenas, ignorando


las diferencias entre maysculas y minsculas; los resultados son
los mismos que strcmp( ).
Compara las 2 cadenas, sin tomar en cuenta el tamao de las
letras. Convierte primero todas las letras a minsculas y luego
los compara y devuelve un valor entero que indica el resultado de
la comparacin: Si cad1 > cad2
El resultado es > 0
Si cad1 = cad2
El resultado es = 0
Si cad1 < cas2
El resultado es < 0
Invierte los caracteres de cad. El carcter de terminacin nulo,
permanece en el mismo lugar. Ejemplo:
//Invertir una cadena leda del teclado
//e imprimir el resultado.
#include <stdio.h>
#include <string.h>
#include <conio.h>
main()
{
char demo[80];
printf("Introduzca una cadena: ");
gets(demo);
strrev(demo);
printf("La cadena inversa es:\n %s \n", demo);
getch();
return 0;
}
//La salida en pantalla es:
//Introduzca una cadena: Es una prueba
//La cadena inversa es:
// abeurp una sE
Convierte los caracteres de cad en letras minsculas.
Convierte los caracteres de cad en letras maysculas.

4.3 Funciones de Clasificacin: Librera <ctype.h>


Dado que C utiliza el conjunto de caracteres ASCII, con frecuencia se necesita determinar la
categora de un carcter o convertir un carcter en maysculas a minsculas, o viceversa.
Existen bibliotecas de C que contienen funciones que pueden ser definidas como macros para
estos propsitos. Las macros estn definidas en el archivo de cabecera ctype.h.
Las macros de clasificacin sirven para determinar qu clase de valor contiene una variable
carcter. Se puede necesitar conocer esta caracterstica para identificar ciertas clases de
caracteres.
Por ejemplo, si un programa pide al usuario que teclee un nmero, pero el usuario teclea una
letra, ser preciso capturar el error.
Otro caso es cuando se desea imprimir un archivo, y hay necesidad de asegurar que el archivo
contiene slo caracteres imprimibles; en caso que se desee que el programa acepte caracteres
de control, se necesita saber cundo el usuario digita un carcter de control.

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)

Devuelve cero (0) si el carcter de argumento es un caracter no


alfanumrico (ni letra ni nmero) o un valor distinto de cero (0) si es un
carcter alfanmrico. Ejemplo:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
main()
{
char carac;
carac = getch();
if(isalnum(carac)!=0)
printf("%c Es letra o digito \n", carac);
else
printf("%c No es letra ni digito \n", carac);
getch();
}
//Salida: 4 Es letra o digito
//Salida: r Es letra o digito
//Salida: * No es letra ni digito
Verifica si carac es un carcter alfabtico. Devuelve cero (0) si carac no
es alfabtico; un valor distinto de cero si carac es alfabtico. Ejemplo:
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
main()
{
char carac;
char c = getch();
if(isalpha!=0) printf("%c es letra\n", c);
carac = getch();
if(isascii(carac)!=0)
printf("%c es ASCII \n", carac);
else
printf("%c no es ASCII \n", carac);
getch();
}
Comprueba si carac es un carcter ASCII, en el rango de 0 a 127. Los
caracteres del 128 al 255 son tratados como no ASCII. Devuelve cero si
carac es no ASCII, y un nmero diferente de cero si carac es ASCII.
Verifica que carac sea un dgito decimal (0 . . . 9). Devuelve un valor
distinto de cero si carac es un dgito, en caso contrario devuelve cero.
Verifica si carac, es una letra minscula. Devuelve un valor distinto de
cero si es una letra minscula; en otro caso devuelve cero.
Verifica si carac es una letra mayscula. Devuelve cero si no es
mayscula, de lo contrario devuelve un valor distinto de cero.

10

tolower(carac)

Convierte una letra mayscula en minscula, siempre y cuando carac sea


una letra mayscula.
toupper(carac)
Convierte una letra minscula en mayscula, siempre y cuando carac sea
una letra minscula.
toascii(numEntero) Convierte un valor entero en un carcter ASCII vlido: C = toascii(entero);

4.4 Funciones de Conversin: Librera <stdlib.h>


Las funciones de conversin de tipos de datos sirven para crear un puente de unin entre los
dos estilos de representacin de nmeros: la cadena de texto legible por los humanos y el
formato binario legible por las mquinas. Las funciones de conversin son ideales para convertir
argumentos de lneas de rdenes de su representacin de cadena al formato interno.
ACLARACIONES:

a) Los caracteres en blanco son saltados.


b) Caracteres ilegales son ignorados.

Existen unas cuantas funciones para convertir cadenas a enteros, enteros largos y valores
flotantes. Estas son:

Convierte una cadena a un nmero entero. La cadena debe tener la


representacin de un valor entero y el formato siguiente:
[espacio en blanco] [signo] [ddd]
donde:

atoi(cad)

[espacio en blanco]

Es una secuencia de escape de


tabulacin o un espacio en
blanco y es opcional

[signo]

Puede ser + o -

[ddd]

Cadena de dgitos.

La conversin termina cuando se encuentra un carcter no reconocible


(carcter nulo, \0, punto decimal o una letra). Si no puede convertir la
cadena devuelve nulo. Ejemplo:
//Convierte la cadena "-123" al entero -123
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
main()
{
int i;
char cadEntera[] = "-123";
i = atoi(cadEntera);
printf("i es %i", i);
getch();
}
// Salida: i es -123

11

atof(cad)

atol(cad)

Convierte una cadena a un nmero real de tipo double, la cadena debe


tener una representacin de caracteres de un nmero real, la conversin
termina cuando encuentra un caracter no reconocido. Ejemplo:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
main()
{
double x;
char cadDoble[] = "200.85";
x = atof(cadDoble);
printf("x es %.2f", x);
getch();
// Convierte la cadena "200.85" a real
} // Salida: x es 200.85
Convierte una cadena a un entero largo. El formato de la cadena debe
de ser: [espacio en blanco] [signo] [ddd]. Ejemplo:
//Convierte cadena "9876543" a entero largo.
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
main()
{
long int i;
char cadEnteroLargo[] = "9876543";
i = atol(cadEnteroLargo);
printf("i es %ld", i);
getch();
}//Salida: i es 9876543

Muchas veces, se necesita en un programa, leer un valor numrico y a continuacin una


cadena, la entrada del nmero se puede hacer con scanf y la de la cadena con gets, as:
. . .
int area;
char cad[81];
. . .
printf(\n Area de la Finca: \t);
scanf(%i,&area);
printf(\n Nombre de la Finca: );
gets(cad);
. . .
Al ejecutarse este fragmento de programa, no se puede introducir el nombre de la finca, el
programa le asigna una cadena vaca, ya que al digitar el valor del rea y el retorno de carro o
enter, inmediatamente se le asigna la cantidad a rea y queda en el buffer interno el caracter de
enter (o fin de lnea), que es el carcter en que termina la captura de una cadena por gets, por
lo no se le asigna ningn carcter a cad. Para lograr leer area y cad se presenta la siguiente
solucin: leer el valor numrico como una cadena de dgitos, y despus transformarla con atoi a
entero:

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.

I. Planteamiento del Problema:


Entrada de datos

Salida de datos

Cadenas de caracteres
originales (3)
II. Anlisis del Problema:
a) Variables de Salida:
Nombre
Tipo
frase4[100]
Alfanumrico

Cadena final, formada por las tres


iniciales.

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

tiene \t%i caracteres\n", strlen(frase4));

//Convierte toda la frase4 a letras mayusculas


strupr(frase4);
puts(frase4);
getch();
return 0;
}
Ejemplo 2: Disear un programa que cuente el nmero de palabras que tiene una cadena de caracteres
y, el nmero de veces que se repiten cada una de las vocales.

I. Planteamiento del Problema:


Entrada de datos

Cadena de caracteres

Salida de datos

Nmero de palabras que tiene la


cadena.
Nmero de veces que aparecen
cada una de las vocales.

15

II. Anlisis del Problema:


a) Variables de Salida:
Nombre
Tipo
pal
Entero
va
Entero
ve
Entero
vi
Entero
vo
Entero
vu
Entero
Se imprime tambin la frase leda

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

Por ejemplo: La casa es bonita tiene


3 espacios en blanco

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

III. Diseo de Solucin:


El flujograma se ha omitido (como ejercicio, el estudiante puede dibujarlo).
IV. Codificacin:
//Cuenta el numero de palabras que tiene una cadena
//y el numero de veces que aparece cada vocal
#include <stdio.h>
#include <conio.h>
#include <string.h>
main(){
char frase1[50];
int pal=0, va=0, ve=0, vi=0, vo=0, vu=0;
int i;
//Cuenta el numero de palabras que tiene una cadena
puts("Digite una frase");
gets(frase1);
for (i=0; i<strlen(frase1); i++) {
if (frase1[ i ] == ' ' )
pal++;
switch (frase1[i])
{
case 'a': case 'A':
va++;
break;
case 'e': case 'E':
ve++;
break;
case 'i': case 'I':
vi++;
break;
case 'o': case 'O':
vo++;
break;
case 'u': case 'U':
vu++;
break;
}
}
printf("\n\n\n La frase:\t %s \t tiene \t%i palabras", frase1, pal+1);

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

I. Planteamiento del Problema:


Entrada de datos

Salida de datos

Cadena de caracteres

Cadena de caracteres modificada


(con las dos primeras palabras al
final).

II. Anlisis del Problema:


a) Variables de Salida:
Nombre
Tipo
aux[ ]
Alfanumrica
aux1[ ]

Alfanumrica

Descripcin
Cadena formada con las dos primeras palabras de la
cadena original (cad).
Cadena resultante, con las primeras dos palabras
invertidas

Se imprime tambin la frase leda


b) Variables de Entrada:
Nombre
Tipo
Descripcin
cad[100]
Alfanumrico Representa la cadena o frase inicial,
c) Restricciones: No existen, las cadenas pueden estar formadas por cualquier tipo de
caracteres, pero deben ser frase1 de 19, frase2 de 20, frase4 de 99 caracteres como mximo;
frase3 tendr tantos caracteres como se le asignen al inicio.
d) Proceso:
Lo primero que se tiene que hacer es separar la cadena en dos:
aux[ ]: que contendr las dos primeras palabras
aux1[ ]: que contendr de la tercera palabra en adelante.
Para hacerlo, se va a copiar en aux solo lo n caracteres que forman las dos primeras
palabras, para lo que se debe saber el valor de n; es decir, cuantos caracteres las forman:
x= strlen(cad)
pal=0

//longitud de la cadena
//contador de palabras

cad[ i ] == ?
Si: pal++
i=0,x,1

pal==2?
Si: y = i

// y es el nmero de caracteres de las dos primeras palabras

Ahora, se copian los y primeros caracteres de cad en aux: strncpy(aux, cad, y);

18

Luego, se almacenan las restantes palabras en la cadena aux1 para lo cual:

Se invierte la cadena leda con strrev (cad)


Se calcula el nmero de caracteres de las ltimas palabras: z = x-y
Se copian los z caracteres de cad (invertida) en aux1: strncpy(aux1, cad, z)
Se invierte aux1 para hacerla legible con: strrev(aux1)
Se invierte cad para volver a la cadena inicial con:
strrev(cad)

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

III. Diseo de Solucin:


El flujograma se ha omitido (como ejercicio, el estudiante puede dibujarlo).
IV. Codificacin:
// Pasa las dos primeras palabras de una cadena al final de la misma.
#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
char cad[100], aux[50]="\0", aux1[50]="\0";
int i,x,y, z, pal=0;
puts("Digite la cadena: ");
gets(cad);
x=strlen(cad);
for (i=0; i<=x; i++)
if (cad[i]==' ' )
{
pal++;
if (pal == 2)
y=i;
}

19

strncpy(aux, cad, y);


printf("\nCadena leida: %s", cad);
printf("\nImpresion de primeras dos palabras leidas:\n");
puts(aux);
z=x-y;
strrev(cad);
printf("\n\nCadena invertida: \t %s",cad);
strncpy(aux1, cad, z);
printf("\n\nImpresion de la Tercera palabra en adelante, al reves:\n");

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;
}

4.6 Arreglos de Cadenas


Un arreglo de cadenas puede servir para agrupar una serie de mensajes. Por ejemplo, todos los
mensajes de error de un programa. Luego, para acceder a cada mensaje, basta con usar su
nmero:
#include <stdio.h>
#include <string.h>
#include <conio.h>
int error(int numErr)
{
char *errores[] = {
"No se ha producido ningun error",
"No hay suficiente memoria",
"No hay espacio en disco",
"Me he cansado de trabajar"
};
printf( "Error numero %i: %s.\n", numErr, errores[numErr] );
return( -1 );
}
main()
{
error( 2 );
getch();
}

20

La salida del programa sera:


Error numero 2: No hay espacio en disco.
Un arreglo de cadenas es un arreglo de punteros a cadenas. El primer elemento de la cadena
("No se ha producido ningun error") tiene un espacio reservado en memoria y errores[0] apunta
a ese espacio.
A continuacin se presenta un ejemplo de ordenacin de cadenas en el que se desea ordenar
una serie de dichos populares:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define ELEMENTOS 5
main()
{
char *dichos[ELEMENTOS] = {
"La avaricia rompe el saco",
"Mas vale pajaro en mano que cien volando",
"No por mucho madrugar amanece mas temprano",
"Dime con quien andas y te dire quien eres",
"A caballo regalado no le mires el diente"
};
char *temp;
int i, j;
printf( "Lista desordenada:\n" );
for( i=0; i<ELEMENTOS; i++ )
printf( " %s.\n", dichos[i] );
for( i=0; i<ELEMENTOS-1; i++ )
for( j=i+1; j<ELEMENTOS; j++ )
if ( strcmp(dichos[i], dichos[j]) > 0 ) {
temp = dichos[i];
dichos[i] = dichos[j];
dichos[j] = temp;
}
printf( "Lista ordenada:\n" );
for( i=0; i<ELEMENTOS; i++ )
printf( " %s.\n", dichos[i] );
getch();
}

21

Salida en pantalla:

22

You might also like