C++: Librería de tratamiento de cadenas

Implementación de métodos de división

¡Prueba gratis durante 10 días

nuestros 1246 cursos !

Prueba gratis Mostrar modalidades de suscripción
No nos vamos a limitar a replicar la funcionalidad de la clase estándar. También vamos a implementar métodos de división de cadenas que utilizan separadores de caracteres unitarios o múltiples. Se trata de funciones ágiles y eficientes que aportan bastante utilidad.
06:40

Transcripción

Los métodos de división de cadena son una incorporación reciente a esta librería. Ofrecen métodos útiles para dividir cadenas en bases separadores de caracteres unitarios o múltiples. Esta es una funcionalidad que no está presente en la librería "strl". La añadí a "BWString" porque me parece muy útil. Aquí tengo una copia de las clases "hello.cpp" y "BWString", extraídas de los ficheros de ejercicios. Las funciones de división de "BWString" dividen cadenas en trozos. Si tengo mi cadena "hola", voy a cambiarle el nombre, llamarla "string" y pasarle varias palabras: "uno dos tres cuatro cinco". Ahora quiero dividirla en función del carácter espacio (' '). El resultado va a estar en un "array". Voy a decir que el resultado automático es igual a... Verás que me da un error, porque en realidad es un puntero único lo que devuelve. En su lugar quiero que sea una referencia. Ahora mi error es solo un "warning", que indica que tengo una variable sin usar. Voy a utilizar un bucle "for" aquí. "for(size_t i = 0; result [i]; ++ i)". Ahora puedo mostrar el resultado. En realidad es un mensaje: "result [i]". No lo está reconociendo, por lo que puedo usar... Es un puntero. Ahora, cuando compilo y ejecuto, tenemos nuestras cadenas "uno dos tres cuatro cinco" separadas. Se han dividido en función de estos separadores. El separador puede ser un único carácter, así o algo más complicado. En vez de un único carácter, puedo darle un "string" y puedo decirlo así y que siga funcionando. Este es el resultado. También, si quiero, puedo limitarlo a solo tres cadenas diferentes en el resultado. Cuando compilo y ejecuto, nuestro tercero ahora es así. Deja de dividir en tres y nos devuelve lo que queda. Vamos a ver cómo funciona. Si recuerdas, en nuestro fichero de cabecera tenemos el puntero único que guarda el "array" y un puntero compartido para cada uno de los objetos individuales. Así que lo que devuelve es el puntero del "array". Esa es la razón por la que tenemos que eliminar la referencia con un puntero de miembro a objeto, en lugar del punto único para el miembro a objeto. Vamos a ver los métodos reales de "split". Primero tenemos un par de firmas alternativas. Una con una coincidencia de carácter y otra con una coincidencia de "string" de caracteres. También tenemos la función principal que hace todo el trabajo, que tiene la coincidencia de "string" de caracteres y la división máxima. Si le pasas a la división máxima un "-1", separa el número máximo que encuentra. En realidad hay un límite: una constante de división máxima que está a 1023 y que debería ser suficiente. Básicamente utiliza este bucle "while" y "strstr" de la librería estándar de tratamiento de cadenas para buscar coincidencias. Para cada coincidencia crea un "buffer" temporal. Copia esa parte del "string" en el "buffer" temporal y lo añade al "array" de división, utilizando la función "_append_split_array". Después borra el "buffer" temporal. Incrementa el puntero y continúa. Nuestro método "_append_split_array". Y tiene uno diferente, por supuesto, para el final de la cadena después de haber encontrado todas las coincidencias. Si todavía queda algún carácter, sabe que ese es el último elemento del "array". "_append_split_array" está aquí, en nuestros métodos privados. "_append_split_array" comprueba si nuestro contador es demasiado grande. Si todavía no tenemos ninguno, inicializa el "array" de división y utiliza el contador de división como el índice. Usa "make_shared" para crear un puntero compartido nuevo y se lo asigna al "array". Después incrementa el contador. Es así de sencillo. Hay un método "_reset_split_array" que hace algunas tareas de gestión de memoria. Lo he comentado antes. Si tenemos un contador, mientras tenga un valor, borramos de uno en uno. Decrementamos el contador hasta el final. Después llamamos a "reset" que, en un puntero compartido, destruye el objeto, llama al destructor y recupera el espacio. Después recupera el "array" como tal, que es el puntero único. También hay un par de métodos de conveniencia para gestionar el resultado de un "array" de división, el resultado de una división. Este es el "split_item", que simplemente devuelve un elemento individual en base al índice. Si estuviese haciendo eso en mi "hello.cpp", podría decir simplemente: "string.split_item(i)". Y compilar y ejecutar. Me daría exactamente el mismo resultado. Es una forma alternativa de acceder a los elementos individuales. También hay un "split_count". Estoy casi seguro de que está en la cabecera. Sí. Este código es porque devuelve ese contador. Está todo aquí en la cabecera. Devuelve el número de elementos que se han dividido. Aquí puedo decir que el contador de división es: "%ld string.split_count". Nos dirá que nuestro contador de división es 3, porque es lo que le hemos dicho. Quita eso. Ahora tenemos 5. Las funciones de división son pequeñas, rápidas y eficientes. Escribí esto es su momento para cada uno de los proyectos prácticos de código en el que necesitaba analizar cabeceras "http". Desde entonces las he utilizado en muchos casos y me parece que son muy útiles.

C++: Librería de tratamiento de cadenas

Adapta tus proyectos en C++ para ofrecer la mejor gestión de recursos usando librerías personalizadas de tratamiento de cadenas, BWString, constructores, operadores, y muchos más.

37 min (9 Videos)
Actualmente no hay comentarios.
 
Software:
Fecha de publicación:15/12/2016

Este curso video2brain está disponible como descarga y para ser visualizado online. ¡Pero no hace falta que decidas entre las dos opciones! Al comprar el curso, disfrutarás de ambas posibilidades.

La descarga te permite ver las lecciones sin estar conectado/a a internet y supone una navegación fácil y ágil entre capítulo y capítulo. Si vas a trabajar en diferentes ordenadores o si no quieres descargarte el curso completo, entra en la web con tus datos de acceso y disfruta directamente de tus vídeos online. Te deseamos que disfrutes de este curso y te resulte de mucha utilidad.

Estamos a tu disposición si tienes cualquier tipo de duda o pregunta.