Ir al contenido principal

Array en C. Parte 4: Operaciones con cadenas de caracteres...

En la entrada anterior iniciamos el tema de las cadenas de caracteres y por la extensión del post decidí explicar por separado algunas de las funciones que utilizaremos para trabajar con ellas y otras operaciones.

Así que manos a la obra....

Longitud de una cadena de caracteres:


Calcular la longitud de una cadena es una operación que se realiza con frecuencia. Si tendríamos que pensar una manera de implementarla lo más sencillo sería contar hasta llegar al final de la misma que está señalado por el caracter nulo ('\0'). Como siempre que queremos contar algo...

Una posible implementación de esto sería la siguiente:

Si vemos el código, nuestro i servirá para "caminar" dentro del while.

A través de una condición simplemente incrementamos i (gracias al operador de incremento) mientras no lleguemos al final de la cadena.
Y al final imprimimos en pantalla la longitud de la cadena que será i-1 ya que con nuestro i++ contaremos una vez adicional a lo que necesitamos.

Este es sólo un ejemplo, para implementarlo existen opciones de lo más variadas dependiendo del gusto de cada uno. Les recomiendo que prueben hacerlo con la estructura iterativa que más les agrade y decidan si usar un contador o no; verán que existe un mundo de posibilidades para ponerlo en práctica.

Para simplificar las cosas también existe una función de la librería string.h que se llama strlen que nos dará el mismo resultado. Strlen devuelve un entero que debemos asignar a una variable como se ve en la imagen:


Su uso no tiene complicaciones  pero recuerden que strlen cuenta de la misma forma que nosotros en el ejemplo anterior, por lo que recomendamos no usarlo dentro de otras iteraciones porque aumentaría mucho el tiempo de ejecución como veremos cuando expliquemos complejidad de algoritmos.

Copiar cadenas de caracteres:

Otra operación que se suele utilizar mucho es la de copiar el contenido de una cadena en otra. Esto se puede lograr con una estructura iterativa teniendo en cuenta dos detalles: primero que la segunda cadena donde guardaremos la copia tenga capacidad suficiente para guardar la primera (se recomienda darle la misma capacidad que ella) y que para copiar una cadena así hay que hacerlo caracter por caracter.

Si tenemos en cuenta esos detalles lograríamos realizar la copia con un código como éste:
Pero al igual que vimos para la longitud, también existe en string.h una función para el copiado de cadenas llamada strcpy. 

Usarla es tan sencillo como vemos en la imagen:

Pero hay que tener cuidado y asegurarnos que la copia tenga capacidad suficiente para guardar la cadena original, ya que strcpy no lo verifica y podría causar desbordamiento.

Otra opción sería usar strncpy, también incluida en string.h. Esta función hace lo mismo que strcpy pero tiene una limitación en el número máximo de caracteres que pueden copiarse. Veamos cómo usarla:


Recuerden dar a las cadenas una capacidad adecuada para evitar los problemas que podrían surgir al usar esta función.

Concatenar cadenas de caracteres:

Concatenar es simplemente unir una cadena con otra. Esto lo podríamos realizar con un bucle pero explicaremos directamente la manera de hacerlo con otra función de string.h llamada strcat.


Usarla es sencillo, en primer lugar pasamos como argumento la cadena que recibirá el resultado de la concatenación y en segundo la otra cadena. Como siempre hay que asegurarse de que la cadena que contendrá el resultado tenga capacidad para albergar ambas cadenas.

Si quisiéramos guardar la concatenación de A y B en otra cadena de nombre C deberíamos hacerlo en dos pasos:


Colocamos "" en C para que se coloque el caracter nulo al comienzo para simular que C está vacía y no haya problemas al concatenarla con A, si no podríamos obtener basura antes de la cadena como en la imagen:


Cuando deberíamos obtener esto:



Comparar cadenas de caracteres:

Las cadenas no se pueden comparar con los operadores que conocemos para comparar valores numéricos. Para poder realizarlo alfabéticamente existe una función de adivinen qué librería (si su respuesta fue string.h adivinaron) que se llama strcmp. Veamos cómo usarla y cómo interpretar el resultado que nos devuelve:

La imagen nos muestra que la forma de la función es muy simple, donde A y B son cadenas de caracteres . Pero escrita así no nos sirve de nada ya que la función devuelve un resultado entero y debemos asignarlo a alguna variable.

Los tres posibles resultados de strcmp pueden ser: 

  • -1 si A está antes que B en orden alfabético.
  • 0 si A y B son iguales.
  • 1 si A está después que B en orden alfabético.
Esto mismo lo ejemplificamos a continuación, mostrando un mensaje de acuerdo al caso que corresponda:



Aquí el caso será 1 ya que la p está después que la n en orden alfabético. 

String.h tiene muchas otras funciones que pueden utilizarse, pero las que explicamos hasta ahora son las más utilizadas. Si quieren probar alguna otra, pueden buscar la lista de funciones que nos ofrece esta librería y probarlas.

ALGUNAS FUNCIONES ÚTILES DE CTYPE.H:

La librería ctype.h también nos ofrece algunas funciones útiles para trabajar con caracteres. A continuación explicaremos algunas de ellas.

Obtener minúsculas o mayúsculas:

Para obtener la minúscula o mayúscula de un caracter usaremos las funciones tolower y toupper respectivamente. 

Si quisiéramos mostrar por pantalla un caracter en mayúscula y minúscula podríamos hacer lo siguiente:


Todo esto sin modificar el caracter original, sólo mostramos por pantalla lo que devuelven estas funciones.

Pero ya que estamos viendo cadenas de caracteres podríamos pensar que si usamos un bucle para recorrer uno por uno los caracteres de nuestra cadena podríamos transformarlos a minúsculas o mayúsculas con estas funciones:

Aquí estamos modificando la cadena original pasando todo a mayúsculas, que sería igual con tolower si quisiéramos transformar nuestra cadena a minúsculas. Si sólo quisiéramos mostrar en pantalla esto sin modificar la cadena bastaría con ir mostrándolas en el bucle directamente con printf sin hacer la asignación.

Preguntas acerca de caracteres:

Ctype.h también nos permite hacer preguntas acerca de los caracteres a través de varias funciones que mostraremos 


En todos los casos hace la pregunta que mostramos en la imagen, si lo es retorna verdadero y si no falso (Un caracter distinto de 0 si es verdadero y 0 si es falso). 

Como nos imaginamos, podríamos hacer estos test para toda una cadena evaluando cada caracter mediante un bucle; de igual forma que hicimos el pasaje a mayúsculas y minúsculas.


Llegamos al final de esta entrada, espero que les sirvan estas operaciones para trabajar con cadenas de caracteres, cualquier duda pueden colocarla como comentario o hacerla a través de nuestra página en facebook. Hasta la próxima.


Comentarios

Entradas populares de este blog

C: Conversiones de tipo (casting) en C...

El casting o simplemente cast  nos permite hacer una conversión explícita de un tipo de dato a otro, a criterio del programador siempre y cuando estos tipos sean compatibles. Este cast se realiza a través de un operador de conversión de tipos (type casting operator) y es un recurso a tener en cuenta ya que hay situaciones en que nos puede resultar de gran utilidad. Hacer uso de un cast es tan sencillo como poner (tipo de dato)  delante de la expresión o variable a convertir. Veamos un ejemplo: Declaramos una variable de tipo int con un identificador tan creativo como "a" y le realizamos diferentes cast a a para mostrarlo como si fuera un float, un double y un char en un printf. Lo que obtendríamos en pantalla sería lo siguiente: Donde tenemos el valor de nuestro a, a convertido en float y double (mostrándolo con 3 cifras decimales) y a convertido en char. Si vemos este último caso, al hacer la conversión de "a" a char toma a como el código ascii de

C: Ejemplos: Congruencia de Zeller (nivel básico) ...

La Congruencia de Zeller es un algoritmo que se atribuye al matemático alemán Julius Christian Johannes Zeller que vivió en el siglo XIX. Este algoritmo nos permite determinar el día de la semana que le corresponde a una fecha determinada del calendario Gregoriano. La fórmula que nosotros usaremos (con algunas modificaciones respecto de la original para poder usarla en  informática) es la siguiente: Donde h es el día de la semana (entre 0 y 6), J es año/100 (la centuria) y K es año mod 100 (el año de la centuria). Y hay que tener en cuenta que los meses de enero y febrero cuentan como el mes 13 y 14 del año anterior. Ahora que tenemos la fórmula, programemos el algoritmo en C mediante el uso de una función: Analicemos el código paso a paso: Tenemos en cuenta el caso de enero y febrero: Dijimos que estos meses corresponden a los meses 13 y 14 del año anterior por lo que los asignamos como corresponde (mes + 12 , que dará 13 para enero y 14 para febrero) y le rest

Algoritmos: Resolución de problemas y refinamientos en pseudocódigo...

En otras entradas, vimos las partes que debe tener nuestro algoritmo en pseudocódigo y las estructuras que utilizaremos para resolverlo. Ahora llega el turno de implementar todo en conjunto para dar origen a nuestra creación. Pero ¿cómo resolvemos un problema así? Para hacerlo, utilizaremos lo que llamamos refinamientos sucesivos. Este concepto consiste en dividir el problema en subproblemas más pequeños y a estos, a su vez, en otros más pequeños; y así sucesivamente hasta que la solución de los últimos sea trivial, sencillo de resolver. Luego usaremos todas las soluciones obtenidas para armar la solución de nuestro problema mayor. Este principio, tiene base en parte de la técnica divide and conquer (dependiendo de la traducción: "divide y vencerás") que es una de las muchas técnicas de resolución de algoritmos existentes. Como vemos, al dividir el problema en otros más pequeños y más fáciles de resolver, podemos pasar de un problema complicado a uno cuya solución es much