Manejo de string

GLib proporciona una serie de funciones para el manejo de cadenas; algunos son exclusivos de GLib y otros resuelven problemas de portabilidad. Todos interoperan muy bien con las rutinas de asignación de memoria GLib.

Para aquellos interesados en una cadena mejor que gchar *, también hay un tipo GString. No se trata en este libro; consulte la documentación de la API para obtener más información.

gint g_snprintf (gchar *string, gulong n, gchar const *format, ...);

Listado: Envoltorio de portabilidad.

El Listado muestra un sustituto que GLib proporciona para la función snprintf(). g_snprintf() envuelve el snprintf() nativo en las plataformas que lo tienen y proporciona una implementación en las que no lo tienen.

Preste atención a no usar la función sprintf() que causa fallas, crea agujeros de seguridad y generalmente es maligna. Al usar g_snprintf() o g_strdup_printf() relativamente seguros (ver más abajo), puedes despedirte de sprintf() para siempre.

#include <glib.h>

gchar * g_strdup (const gchar *str);
gchar * g_strndup (const gchar *str, gsize n);
gchar * g_strdup_printf (const gchar *format, ...);
gchar * g_strdup_vprintf (const gchar *format, va_list args);
gchar * g_strnfill (gsize length, gchar fill_char);

Listado: Asignar cadenas.

El Listado muestra la amplia gama de funciones de GLib para asignar cadenas. Como era de esperar, g_strdup() y g_strndup() producen una copia asignada de str o los primeros n caracteres de str. Para mantener la coherencia con las funciones de asignación de memoria GLib, devuelven NULL si se les pasa un puntero NULL. Las variantes printf() devuelven una cadena formateada. g_strnfill() devuelve una cadena de tamaño length rellena con fill_char.

g_strdup_printf() merece una mención especial; es una forma más sencilla de manejar este código común:

gchar *str = g_malloc (256);
g_snprintf (str, 256, "%d printf-style %s", num, string);

En su lugar, podría decir esto y evitar tener que averiguar la longitud adecuada del búfer para arrancar:

gchar *str = g_strdup_printf ("%d printf-style %s", num, string);

#include <glib.h>

gchar * g_strchug (gchar *string);
gchar * g_strchomp (gchar *string);
gchar * g_strstrip (gchar *string);

Listado: Modificaciones de cadenas in situ.

Las funciones del Listado modifican una cadena en el lugar: g_strchug() y g_strchomp() "chug" la cadena (elimina los espacios iniciales), o "chomp" (eliminar los espacios finales). Esas dos funciones devuelven la cadena, además de modificarla en el lugar; en algunos casos, puede ser conveniente utilizar el valor de retorno. Hay una macro, g_strstrip(), que combina ambas funciones para eliminar los espacios iniciales y finales.

#include <glib.h>

gdouble g_strtod (const gchar *nptr, gchar **endptr);
const gchar * g_strerror (gint errnum);
const gchar * g_strsignal (gint signum);

Listado: Conversiones de cadenas.

El listado 2.10 muestra algunas funciones semi-estándar más que envuelve GLib. g_strtod es como strtod() -- convierte la cadena nptr en un double -- con la excepción de que también intentará convertir el double en la configuración local de "C" si no puede convertirlo en la configuración local predeterminada del usuario. *endptr se establece en el primer carácter no convertido, es decir, cualquier texto después de la representación numérica. Si la conversión falla, *endptr se establece en nptr. endptr puede ser NULL, lo que hace que se ignore.

g_strerror() y g_strsignal() son como sus equivalentes no g_ , pero portátiles. (Devuelven una representación de cadena para un errno o un número de señal).

#include <glib.h>

gchar * g_strconcat (const gchar *string1, ...);
gchar * g_strjoin (const gchar *separator, ...);

Listado: Concatenar cadenas.

GLib proporciona algunas funciones convenientes para concatenar cadenas, que se muestran en el Listado. g_strconcat() devuelve una cadena recién asignada creada concatenando cada una de las cadenas en la lista de argumentos. El último argumento debe ser NULL, por lo que g_strconcat() sabe cuándo detenerse. g_strjoin() es similar, pero separator se inserta entre cada cadena. Si separator es NULL , no se usa ningún separador.

#include <glib.h>

gchar ** g_strsplit (const gchar *string,
                     const gchar *delimiter,
                     gint max_tokens);
gchar * g_strjoinv (const gchar *separator, gchar **str_array);
void g_strfreev (gchar **str_array);

Listado: Manipulación de vectores de cadena terminados en NULL.

Finalmente, el Listado resume algunas rutinas que manipulan matrices de cadenas terminadas en NULL. g_strsplit() rompe string en cada delimiter, devolviendo una matriz recién asignada. g_strjoinv() concatena cada cadena en la matriz con un separator opcional, devolviendo una cadena asignada. g_strfreev() libera cada cadena en la matriz y luego la propia matriz.