2.1.5 Обработка строк

glib предоставляет некоторое количество функций для обработки строк; некоторые из них встречаются только в glib, другие решают проблемы совместимости. Все они отлично взаимодействуют с процедурами распределения памяти glib.

Для тех, кто заинтересован в лучшем типе для строки, чем gchar *, есть тип GString. Он не рассматривается в этой книге, но документация по нему доступна на http://www.gtk.org/.

Список функций 2..2: Функции для совместимости
"#include "<glib.h>
gint g_snprintf(gchar *buf, gulong n, const gchar *format, ...) gint g_strcasecmp(const gchar *s1, const gchar *s2) gint g_strncasecmp(const gchar *s1, const gchar *s2, guint n)

Список функций 2..2 показывает некоторые замены, которые glib предоставляет для широко реализованных, но непортируемых расширений к ANSI C.

Одна из раздражающих вещей в C -- это то, что он предоставляет возможности для сбоев и дыр в безопасности, обычно через пагубный "sprintf()", в то время как относительно безопасный и широко реализованный "snprintf()" является расширением стандарта. "g_snprintf()" оборачивает стандартный "snprintf()" на платформах его имеющих, и предоставляет его реализацию на платформах его не имеющих. Итак, вы можете сказать прощай "sprintf()"'у навсегда. Даже лучше: классический "snprintf()" не гарантирует, что он завершит NULL'ом заполняемый им буфер, "g_snprintf()" -- гарантирует.

"strcasecmp()" и "g_strncasecmp" производят регистронезависимое сравнение двух строк, опционально с заданием максимальной длины. "strcasecmp()" доступна на многих платформах, но не универсальна, поэтому рекомендуется использовать вместо нее функции из glib.

Функции в списке функций 2..3 изменяют саму строку: первые две преобразуют строку к нижнему или верхнему регистру соответственно, тогда как "g_strreverse()" переставляет символы в строке задом-наперед. "g_strchug()" и "g_strchomp()" удаляют лидирующие и завершающие пробелы. Эти последние две функции возвращают строку в дополнение к модификации ее самой; в некоторых случаях может быть удобно воспользоваться возвращаемым значением. Есть макрос "g_strstrip()", который объединяет обе функции для удаления и лидирующих, и завершающих пробелов; он используется так же, как и отдельные функции.

Список функций 2..3: Изменения в самих строках
"#include "<glib.h>
void g_strdown(gchar *string) void g_strdup(gchar *string) void g_strreverse(gchar *string) gchar *g_strchug(gchar *string) gchar *g_strchomp(gchar *string)

Список функций 2..4 показывает чуть больше полу-стандартных функций, которые оборачивает glib. "g_strtod()", как и "strtod()", преобразовывает строку nptr к числу с плавающей точкой с двойной точностью, единственным исключением -- она также попытается преобразовать строку в локали "C", если не смогла преобразовать строку в локали по умолчанию. *endptr устанавливается на первый непреобразованный символ, то есть на любой текст после числа. Если преобразование не выполнилось, *endptr указывает на nptr. endptr может принимать значение NULL с дальнейшим игнорированием.

"g_strerror()" и "g_strsignal()" аналогичны своим не-"g_" эквивалентым, но портируемы. (Они возвращают строковое представление errno или номера сигнала.)

Список функций 2..4: Преобразование строк
"#include "<glib.h>
gdouble g_strtod(const gchar *nptr, gchar **endptr) gchar *g_strerror(gint errnum) gchar *g_strsignal(gint signum)

Список функций 2..5 показывает богатый набор функций для выделения памяти для строк. Как ни странно, "g_strdup()" и "g_strndup()" делают распределенную копию str или первых n ее символов. Для согласованности с функциями glib выделения памяти, они возвращают NULL, если им передать указатель на NULL. Варианты "printf()" возвращают форматированную строку. "g_strescape()" обрамляет любые символы 3#3 в аргументе вставкой еще одного 3#3 перед ними, возвращая обрамленную строку. "g_strnfill()" возвращает строку размером length, заполненную "fill_char".

"g_strdup_printf()" заслуживает особого упоминания: это более простой способ обработать нижеследующий часто встречающийся кусок кода: gchar* str = g_malloc(256); g_snprintf(str, 256, "%d printf-style %s", 1, "format"); Вместо этого вы можете сказать вот так, и избежать необходимости точного определения размера буфера: gchar* str = g_strdup_printf("%d printf-style %s", 1, "format");

Список функций 2..5: Выделение памяти для строк
"#include "<glib.h>
gchar *g_strdup(const gchar *str) gchar *g_strndup(const gchar *format, guint n) gchar *g_strdup_printf(const gchar *format, ...) gchar *g_strdup_vprintf(const gchar *format, va_list args) gchar *g_strescape(gchar *string) gchar *g_strnfill(guint length, gchar *fill_char)

glib предоставляет некоторые удобные функции для объединения строк, показанные в списке функций 2..6. "g_strconcat()" возвращает свежевыделенную строку, созданную объединением всех строк в списке аргументов. Последний аргумент должен быть NULL, чтобы "g_strconcat()" знала, когда остановиться. "g_strjoin()" действует аналогично, только вставляет separator между объединяемыми строками. Если separator равен NULL, он не будет использоваться.

Список функций 2..6: Объединение строк
"#include "<glib.h>
gchar *g_strconcat(const gchar *string1, ...) gchar *g_strjoin(const gchar *separator, ...)

Наконец, список функций 2..7 объединяет в себе несколько процедур, которые манипулируют с массивами строк, завершенными NULL. "g_strsplit()" разбивает строку string в каждом из разделителей, описанных в delimiter, возвращая свежевыделенный массив. "g_strjoinv()" объединяет каждую строку в массиве, возвращая свежевыделенную строку. Если задан separator, то он вставляется между строками. "g_strfreev()" освобождает каждую строку в массиве, а затем и сам массив.

Список функций 2..7: Объединение строк
"#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)


Linux Land
2000-09-15