Está en la página 1de 14

Tutorial de cadenas de texto Edgar Villegas A.

Tutorial de cadenas de texto en C


Bienvenidos a este tutorial, ojal con esto aprendan sobre cadenas de texto.
Cadena de texto o cadena de caracteres, qu es? Me pareca tonto ese nombre, hasta que lo
analic.

S
Cadena

Carcter

Cadena de caracteres

Y eso es! Su nombre no haba sido tan tonto. Una de texto o cadena de caracteres es una unin
de caracteres con las que podemos formar palabras, frases, etc. Cada eslabn de la cadena
corresponde a un carcter. En ese dibujo trucho, tenemos una cadena de 3 caracteres: SOL.
Con las cadenas de texto podemos representar palabras, frases, etc en la compu, as no solo
tenemos que batirnoslas con nmeros.

Concatenacin
La concatenacin es la accin de unir cadenas de texto. Por ejemplo si tenemos la palabra
Lupita y le concatenamos Ferrer tenemos la nueva cadena LupitaFerrer.

Vamos al grano, como se usan en C?


Rica iba la introduccin, pero da flojera vamos al grano.
Para declarar una variable que sea cadena de texto, utilizamos la palabra reservada char, y entre
corchetes el tamao mximo de la cadena de texto (ms uno, despus explico por qu), as:
char nombre[30];
En esta variable podemos almacenar una cadena de hasta 29 caracteres (siempre menos uno).
Cmo leer e imprimir cadenas de texto?
Pues con cin y cout, como cualquier variable que hayamos estado tratando.
Un ejemplo de una vez
Este programa lee el nombre y el apellido, e imprime un saludo a dicha persona.
#include<iostream>
using namespace std;
int main(){
char nombre[20];
char apellido[30];

Tutorial de cadenas de texto Edgar Villegas A.


cout<<"Nombre: "; cin>>nombre;
cout<<"Apellido: "; cin>>apellido;
cout<<"Hola "<<nombre<<" "<<apellido<<endl;
return 0;
}
El programa funciona as:
Nombre: Lupita
Apellido: Ferrer
Hola Lupita Ferrer

Copia de cadenas
Cmo haramos si quisiramos almacenar el nombre y el apellido seguidos en una sola variable?
Pues usamos una concatenacin. Esta accin une dos cadenas, como se indic ms arriba.
Para concatenar dos cadenas se usa la funcin strcat de string.h.
strcat(destino, cad2);
Esta funcin aade cad2 al final de destino, resultando la unin en destino.
Chino? Mejor probar este ejemplo:
#include<iostream>
using namespace std;
int main(){
char nombre[60];
char apellido[30];
cout<<"Nombre: "; cin>>nombre;
cout<<"Apellido: "; cin>>apellido;
strcat(nombre, apellido);
cout<<nombre<<endl;
cout<<"Hola "<<nombre<<endl; //Ojo, no imprimimos apellido
system("pause");
return 0;
}
Resultado de la ejecucin del programa:
Nombre: Lupita
Apellido: Ferrer
LupitaFerrer
Hola LupitaFerrer
Ok, funciona como queramos, pero. a la m la concatenacin se ha guardado en la variable
nombre!. Por eso no podramos imprimir el nombre suelto de nuevo .
Cmo podramos guardar el valor del nombre para no perderlo? Cmo podriamos hacer lo
siguiente, en C?
copiaNombre nombre

Tutorial de cadenas de texto Edgar Villegas A.

Pues si pensaste en el =, estas mal.


En C++ NO podemos hacer lo siguiente para copiar cadenas de caracteres
copiaNombre = nombre;
//Incorrecto!!
Para copiar o asignar variables de texto, utilizamos la funcin strcpy.
strcpy(destino, origen);
Esto equivale a hacer destinoorigen.
Y ahora? Como lo usamos pa nuestro programa?
Pues del siguiente modo:
#include<iostream>
using namespace std;
int main(){
char nombre[20];
char apellido[30];
cout<<"Nombre: "; cin>>nombre;
cout<<"Apellido: "; cin>>apellido;
char copiaNombre[25];
strcpy(copiaNombre, nombre); //Con esto se hace la copia
strcat(nombre, apellido);
cout<<nombre<<endl;
cout<<"Hola "<<nombre<<endl; //Ojo, no imprimimos apellido
cout<<"El nombre era: "<<copiaNombre<<endl;
return 0;
}
Nombre: Lupita
Apellido: Ferrer
LupitaFerrer
Hola LupitaFerrer
El nombre era: Lupita
Para copiar slo los primeros n caracteres, usamos la siguiente funcin:
strncpy(destino, origen, num_caracteres);
Si quisiramos copiar solo los primeros 3 caracteres (no todos), haramos
strcpy(copiaNombre, nombre, 3).
Ejercicio:
Cambiar el programa anterior para probar el strncpy.

Tutorial de cadenas de texto Edgar Villegas A.

Comparar cadenas de caracteres


Qu pasa si queremos saber si dos cadenas de texto son iguales?

cad1=cad2
(Disculpa la truchedad del dibujo)
Qu pasa si queremos saber qu cadena es mayor que otra, por ejemplo para saber quien debera
ir tras de quin en la lista del curso?
Pues todas esas operaciones de comparacin se hacen con la funcin strcmp.
strcmp(cad1, cad2);
Esta funcin, retorna un 0 cuando las cadenas son iguales (cad1=cad2), retorna un nmero
positivo cuando cad1>cad2 y retorna un nmero negativo cuando cad1<cad2.
Veamos la comparacin de cadenas cuando queremos saber si son simplemente iguales o
diferentes:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char password[30];
char password2[30];
cout<<"CAMBIO DE CONTRASEA"<<endl;
cout<<"Indique su nueva contrasea: ";
cin>>password;
cout<<"Repita su contrasea: ";
cin>>password2;
if(strcmp(password, password2)==0) //Si es 0 son iguales
{
cout<<"Aceptado. Contraseas iguales."<<endl;
}
else
{
cout<<"Invlido. Contraseas diferentes."<<endl;
}
system("pause");
return 0;
}
Este es el resultado de la ejecucin del programa

Tutorial de cadenas de texto Edgar Villegas A.


CAMBIO DE CONTRASEA
Indique su nueva contrasea: dulce
Repita su contrasea: dulce
Aceptado. Contraseas iguales.
Para probar ms del strcmp, veamos el siguiente ejemplo:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char cad1[20], cad2[20], cad3[20], cad4[20];
strcpy(cad1, "Drogas");
strcpy(cad2, "Drogas");
strcpy(cad3, "Rock 'n Roll");
cout<<cad1<<" vs. "<<cad2<<"="<< strcmp(cad1,
cout<<cad1<<" vs. "<<cad3<<"="<< strcmp(cad1,
cout<<cad2<<" vs. "<<cad1<<"="<< strcmp(cad2,
cout<<cad2<<" vs. "<<cad3<<"="<< strcmp(cad2,
cout<<cad3<<" vs. "<<cad1<<"="<< strcmp(cad3,
cout<<cad3<<" vs. "<<cad2<<"="<< strcmp(cad3,

cad2)
cad3)
cad1)
cad3)
cad1)
cad2)

<<endl;
<<endl;
<<endl;
<<endl;
<<endl;
<<endl;

system("pause");
return 0;
}
El resultado es:
Drogas vs. Drogas=0
Drogas vs. Rock 'n Roll=-1
Drogas vs. Drogas=0
Drogas vs. Rock 'n Roll=-1
Rock 'n Roll vs. Drogas=1
Rock 'n Roll vs. Drogas=1
Como se puede apreciar, si la primera cadena es alfabticamente posterior (mayor) a la segunda,
se retorna un nmero positivo (1). Cuando son iguales, retorna un 0 y si la primera cadena es
anterior (menor) a la segunda, se retorna un nmero negativo (-1).

Averiguar la longitud de una cadena caracteres


Para esto usamos la funcin strlen, que retorna la cantidad de caracteres de la cadena.
strlen(cad)
Ejemplo:
int main(){
char nombre[20];

Tutorial de cadenas de texto Edgar Villegas A.


cout<<"Nombre: "; cin>>nombre;
cout<<"Tu nombre tiene "<<strlen(nombre)<<" caracteres";
return 0;
}

Acceso individual a caracteres de una cadena


Las cadenas se representan en la memoria RAM ocupando varias celdas de memoria (cada
carcter ocupa un byte, almacenndose en memoria su valor ascii).
Las posiciones de estos caracteres se cuentan desde 0 (el primer carcter tiene la posicin 0).
Adicionalmente, se aade un carcter llamado carcter nlo o carcter de terminacin, que se
representa con \0. Este carcter indica el fin de la cadena.
Los caracteres pueden accederse individualmente, como si fueran variables distintas, utilizando
el nombre de la cadena seguido de corchetes, con la posicin entre los corchetes.
Bla bla bla. Veamos un ejemplo. Por ejemplo, si en la cadena cad con declaracin:
char cad[20];
tenemos la cadena TEQUILA CON SAL, estara representada as:

Pos

T E Q U I L A
0
1
2
3
4
5
6
7
cad[0]

C O N S A L \0
8
9
10 11 12 13 14 15 16 17 18 19

cad[6]

cad[11]

cad[16]

Como se puede ver en cad[0] tenemos la T, en cad[11] tenemos una N y en cad[16] tenemos
el carcter terminador.
Probmoslo con un programa:
#include<iostream>
using namespace std;
int main(){
char cad[20];
strcpy(cad, "TEQUILA CON SAL");
cout<<cad<<endl;
cout<<cad[0]<<endl;
cout<<cad[6]<<endl;
cout<<cad[10]<<endl;
cout<<cad[15]<<endl;
return 0;
}
Al ejecutar obtenemos:

Tutorial de cadenas de texto Edgar Villegas A.


TEQUILA CON SAL
T
A
N
Como se puede ver, el carcter terminador es invisible.
Si quisieramos mostrar todos los caracteres, uno por uno podramos hacer lo siguiente:
cout<<cad[0]<<endl;
cout<<cad[1]<<endl;
cout<<cad[2]<<endl;
...
cout<<cad[13]<<endl;
cout<<cad[14]<<endl;
zzzzzzzzes una tarea muy repetitiva. Por qu no hacer un ciclo for de 0 a 14?
int main(){
char cad[20];
strcpy(cad, "TEQUILA CON SAL");
cout<<cad<<endl;
int i;
for(i=0; i<=14; i++)
{cout<<cad[i]<<endl;}
return 0;
}
Al ejectuarse, se despliega lo siguiente:
TEQUILA CON SAL
T
E
Q
U
I
L
A
C
O
N
S
A
L
Ohh Pero que sucede si no supieramos la longitud de la cadena? Qu lmite superior
pondramos en el for?. Pues es sencillo, el lmite superior seria strlen(cad)-1.

Tutorial de cadenas de texto Edgar Villegas A.


Otra opcin sera hacerlo con un while, hasta hallar el carcter terminador:
int main(){
char cad[20];
strcpy(cad, "TEQUILA CON SAL");
cout<<cad<<endl;
int i = 0;
while(cad[i]!='\0')
{
cout<<cad[i]<<endl;
i++;
}
return 0;
}
El resultado es el mismo que el anterior.
Interesante no? Estamos diciendo Mientras no hallemos el carcter terminador, mustrame cada
carcter.

Modificar caracteres individuales de una cadena.


Los caracteres pueden tratarse como variables separadas. Por ejemplo, si quisieramos volver
minscula el primer carcter de nuestro ejemplo, haramos lo siguiente:
cad[0] = 't';
Se debe notar que cuando se escribe caracteres individuales, se encierra entre comillas simples
(apstrofes), en tanto que cuando se escribe cadenas de caracteres, se usa la comilla doble ().
Con el siguiente programa, volvemos a minsculas las iniciales de nuestra cadena:
int main(){
char cad[20];
strcpy(cad, "TEQUILA CON SAL");
cout<<cad<<endl;
cad[0] = 't';
cad[8] = 'c';
cad[12] = 's';
cout<<cad<<endl;
system("pause");
return 0;
}
El resultado es:
TEQUILA CON SAL
tEQUILA cON sAL

Tutorial de cadenas de texto Edgar Villegas A.

Ejemplos:
Programa que muestra los caracteres en posiciones pares:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char cad[20];
int i;
strcpy(cad, "TEQUILA CON SAL");
cout<<cad<<endl;
for(i=0; i<=strlen(cad)-1; i++)
{
if(i%2==0)
{
cout<<cad[i]<<endl;
}
}
system("pause");
return 0;
}
Resultado:
TEQUILA CON SAL
T
Q
I
A
C
N
S
L
Otra forma sera cambiar el for de arriba para no tener que poner -1, podemos hacerlo con <. O
sea:
for(i=0; i<strlen(cad); i++)
Ya que la parte central del for es la condicin de repeticin. De hecho esta es la forma ms
habitual de recorrer una cadena.
#include<iostream>
using namespace std;
int main(){
char cad[20];
int i;
strcpy(cad, "TEQUILA CON SAL");

Tutorial de cadenas de texto Edgar Villegas A.


cout<<cad<<endl;
for(i=0; i<strlen(cad); i++)
{
cout<<(int)cad[i]<<endl;
}
system("pause");
return 0;

//Volvemos a entero el caracter

}
Pa probar esto y matar dos pjaros de un tiro, mostremos los valores ASCII de cada carcter:
TEQUILA CON SAL
84
69
81
85
73
76
65
32
67
79
78
32
83
65
76
Programa para saber si el ltimo carcter de una cadena es igual al primero:
using namespace std;
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char cad[20];
cout<<"Ingrese una cadena: ";
cin>>cad;
int ult = strlen(cad)-1;
if(cad[0]==cad[ult])
{
cout<<"Si son iguales"<<endl;
}
else
{
cout<<"No son iguales"<<endl;
}

Tutorial de cadenas de texto Edgar Villegas A.


system("pause");
return 0;
}
Resultado:
SONRISAS
Si son iguales
Notar que para comparar cadenas se usa strcmp, pero para comparar caracteres individuales, se
compara con ==.
Ejemplo:
Programa para saber si una palabra es palindromtica (lo mismo que capica).
Para esto, compararemos el ltimo carcter con el primero, el segundo con el penltimo, etc. En
una variable k, contaremos cuantos caracteres varan. Si al final k=0, entonces es palindromtico.
#include<iostream>
using namespace std;
int main(){
char cad[20];
cout<<"Ingrese una cadena: ";
cin>>cad;
int i, n = strlen(cad), k=0;
for(i=0; i<n/2; i++)
{
if(cad[i]!=cad[n-1-i])
{
k++;
}
}
if(k>0)
{
cout<<"No es palindromtica"<<endl;
}
else
{
cout<<"Es palindromtica"<<endl;
}
system("pause");
return 0;
}
Resultado
Ingrese una cadena: ORURO
Es palindromtica

Tutorial de cadenas de texto Edgar Villegas A.

Ejemplo:
Leer el nombre de un archivo y determinar la extensin de este. O sea, si se ingresa tarea.txt, el
programa debe desplegar txt.
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char arch[20];
cout<<"Ingrese el nombre del archivo: ";
cin>>arch;
int n = strlen(arch);
//Buscamos un punto desde el final (en reversa)
int i=n-1;
while(arch[i]!='.')
{
i--;
}
//Ahora en i tenemos almacenada la posicion del punto
i++;
//Procedemos a copiar desde ahi a otra cadena auxiliar
char ext[10];
int j=0;
while(i<=n)
{
ext[j] = arch[i];
i++;
j++;
}
cout<<"La extensin es: "<<ext;
system("pause");
return 0;
}

Resultado:
Ingrese el nombre del archivo: tarea.txt
La extensin es: txt

Caracteres escapados
Que nombre mas raro no?... Hay ciertos caracteres especiales que deben ser antepuestos con una \
en una cadena de texto:

Tutorial de cadenas de texto Edgar Villegas A.


\t
\n
\\
\'
\"

Carcter de tabulacin
Salto de lnea
Barra invertida (\)
Comilla simple
Comilla doble

A eso se le llama escapar, aadirle los caracteres extra adecuados (en nuestro caso la \) para
que el carcter se muestra como queremos. Pq escapar? En bolas.
Por ejemplo, si queremos almacenar el siguiente texto:
Este
es un ejemplo
con "caracteres especiales'
debe anteponer una \ con estos

Siempre se
caracteres.

Deberamos almacenar en una cadena como se detalla a continuacin:


#include<iostream>
#include<string.h>
using namespace std;
int main(){
char cad[20];
strcpy(cad, "Este\nes un ejemplo con \"caracteres
especiales\'\tSiempre se\ndebe anteponer una \\ con
estos\tcaracteres.");
cout<<cad<<endl;
cad[30] = '\n';
cout<<cad<<endl;
system("pause");
return 0;
}
Prueba el anterior programa pa ver que sale.

Continuar

Tutorial de cadenas de texto Edgar Villegas A.


Ejercicios
0) Realice un programa que lea una cadena, las copie a otras 3 y muestre todas
1) Realice un programa que lea 5 cadenas y las concatene en una sola.
2) Realice un programa que lea 6 cadenas y las concatene, separadas por espacios
3) Realice un programa que lea 10 cadenas e indique la mayor y la menor (alfabticamente)
4) Realice un programa que lea un nombre y dos apellidos, y despliegue las iniciales
5) Realice un prog. que cuente cuantas a tiene una cadena
6) Realice un prog. que cuente cuantas vocales tiene una cadena (en minscula o mayscula).
7) Realice un prog. que intercambie la primera y ltima letras de una cadena
8) Realice un prog. que cuente cuantas letras maysculas hay (sug. Ver el cdigo ascii)
9) Realice un prog que lea dos cadenas y diga cual tiene ms caracteres.
10) Realice un prog. que invierta el contenido de una cadena
11) Realice un prog. que lea una cadena de puro nmeros y que convierta este valor a un entero,
posteriormente imprima la mitad de este nmero (con decimales).
12) Realice un progr. que lea una cadena en minsculas y la convierta a maysculas (sugerencia,
analizar el cdigo ascii)
12) Realice un prog. que lea n cadenas e imprima en total cuantas maysculas hubo, y cuanto
miden en promedio- las palabras.

También podría gustarte