08 septiembre 2009

Encadenándose en C y C++

cadenas Las cadenas son tipos de datos esenciales para las aplicaciones de hoy.  Imagínate un programa donde no pudieras escribir tu nombre, dirección o cualquier otra palabra.  Sin embargo, en C el tipo de dato String (o algo similar) no existe (otros lenguajes, como Visual Basic 6, 2005 y 2008 sí lo tiene) sino que tienes que declarar un arreglo de caracteres (si tienes dudas sobre arreglos en C/C++ puedes ver este post).

En este post voy a ejemplificar como se pueden manipular cadenas de texto en C y C++.  El mensaje se divide en dos partes: en la primera voy a tratar cadenas en C (lo cual también funciona en el C++) y en la segunda voy a usar objetos propios de C++ (lo cual no funciona en C “no-mas”). 

Cadenas en C

Dicho lo anterior, comencemos con el uso de cadenas en C “normalito”.  Para empezar, se declaran como cualquier otro arreglo de tipo char, por ejemplo:

char x[15];

lo cual declara un arreglo/cadena que puede contener 14 letras máximo.  ¿Por qué solo 14 cuando lo declaré de 15?  Precisamente porque todo texto en C debe terminar un el carácter ‘\0’ que significa “hasta aquí terminó el texto”.  De esta manera, si almacenas “Tony”, realmente se guarda “Tony\0” y eso le permite a C manejar cadenas de diferente longitud.

También se permite declarar una cadena mediante un apuntador (seguramente sabe, y si no aquí te cuento el chisme, un arreglo puede ser usado como apuntador y viceversa).  Si ese es el caso, podrías declararlo como:

char *x;

Solo que en este último caso, no defines la longitud máxima que puede tener la cadena.

Como es un relajo intentar usar cadenas como arreglos, alguna alma caritativa se le ocurrió hacer un montón de funciones que nos facilitan la vida a la hora de usar cadenas.  Esta librería es la string.h y voy a mencionar sus funciones principales (abajo escribo un programa sencillo que ejemplifica su uso y sintaxis):

Función

Propósito

strcpy

Asigna una cadena a otra.  El nombre de la función viene de STRing CoPY.

strcmp

Compara 2 cadenas para ver su orden alfabético.  El nombre viene de STRing CoMPare.

strlen

Devuelve la longitud de una cadena (o sea, el número de caracteres que lo compone).  El nombre viene de STRing LENgth.

strcat

Añade una cadena al final de otra.  El nombre viene de STRing conCATenation.

Veamos un ejemplo muy simple que ejemplifica el uso de estas funciones.  Aquí está el código fuente (haz clic sobre la imagen para que se vea en grande) que fue hecha con el compilador Borland C++ versión 5.02 (que puedes descargar gratis aquí).

01-Código

Así se ve a la hora de ejecutar el programa:

02-Ejecución

Además de estas funciones básicas, también tiene funciones para encontrar un carácter en una cadena (strchr y strrchr), buscar subcadenas (o sea, extraer parte de la cadena con strstr), etc.

También cabe recalcar que en la librería ctype.h existen funciones para comparar caracteres, pero esto se tiene que hacer un carácter a la vez.  Por ejemplo isalnum te dice si es un carácter alfanumérico, isalpha te dice si es una letra,  isdigit te dice si es un número (dígito entero), islower te dice si es una letra minúscula, isupper si es una letra mayúscula, entre otros.  También puede convertir caracteres, por ejemplo toupper convierte un carácter a mayúscula y tolower lo hace minúscula.

Si solo te interesa cadenas en C, hasta aquí llegamos.  Sin embargo, si quieres adentrarte al mundo de los objetos, te sugiero que te quedes.  C++ tiene una clase que hace el uso de cadenas mucho, pero mucho más sencillo.

Cadenas en C++

En C++ otra persona iluminada decidió facilitarnos la vida aún más.  Aprovechando las cualidades de la programación orientada a objetos (si quieres saber más sobre estas características, puedes leer este post sobre la programación orientada a objetos) y creó una clase llamada string que nos brinda muchas facilidades para manejar este tipos de datos.  Vamos viendo de qué se trata.

Aquí pongo el código de un programa que usa el objeto string.  El código está hecha en Visual C++ 2008 Express Edition (que puedes conseguir gratis aquí).  Si tienes problemas en como usar el Visual C++ 2008, puedes ver el tour que hice aquí.

03-Código 

Y así se ve a la hora de ejecución:

04-Ejecución

Al igual que con la librería string.h en C, hay funciones para buscar, generar subcadenas, etc.  Aquí pongo una tabla donde vienen muchas funciones que puedes hacer con el objeto string.

Ejemplo

Lo que hace

cin >> s;

Cambia el valor de s con lo que teclea el usuario.
El valor termina cuando encuentre un espacio o ENTER.

cout << s;

Escribe en la pantalla lo que está guardado en s.

getline(cin, s, ‘\n’);

Lee todo un renglón desde el teclado (ver el código que escribí antes).

i = s.length();
i = s.size();

Devuelve el número de caracteres que contiene la cadena (ver ejemplo).

if(s.empty()) i++;
if(s =
= "") i++;

Ambos ejemplo incrementan i en 1 si la cadena está vacía.
if (s < s2) i++;

Compara dos cadenas alfabéticamente.  Aquí incrementa i si s es menor que s2.

s2 = s2 + "x";
s2 += "x";

Concatena x al final de s2.

s = s2.substr(1,4);
s = s2.substr(1,50);

Subcadenas:
El primer ejemplo comienza en la posición 1 de la cadena s2 y devuelve los 4 siguientes caracteres (4 letras incluyendo el de la primera posición).  El segundo ejemplo devuelve las 50 primeras letras o hasta que termine la cadena.  Recuerda que la primera posición de una cadena es el 0.

s.replace(4,3,"x");

Reemplazo de subcadenas:
Reemplaza los 3 caracteres de s comenzando en la posición 4 con el carácter x.

s.erase(4,5);

Elimina 5 caracteres de s comenzando en la posición 4.
i = s.find("ab",4); Búsqueda de subcadenas:
Devuelve la posición donde comienza la cadena “ab” en s comenzando a buscar desde la posición 4.

Espero que esto te de suficiente material para hacer todo tipo de cosas con cadenas en C y C++.  ¡Hasta la próxima!

Publicar un comentario
Related Posts Plugin for WordPress, Blogger...