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.