Отправляет email-рассылки с помощью сервиса Sendsay

Практические советы по GTK+

  Все выпуски  

Практические советы по GTK+ Работа со строками


 
Работа со строками:

В состав GTK входит библиотека Glib которая содержит множество полезных функций,
которые кстати можно использовать не только из GTK приложений, но и из любых
других программ. Если Вы хотите пользоваться только Glib без GTK, тогда нужно будет
включить заголовочный файл <glib.h>

Многие функции дублируют posix функции для работы со строками, но есть и уникальные.
Мне больше всего нравится функция g_strdup_printf(), которая аналогична sprintf,
но более безопасная, так как сама вычислит необходимый размер памяти для строки
и выделит память.
Пример:
char *str = g_strdup_printf("количество = %d",count);
Главное не забыть потом выполнить очистку памяти
g_free(str).
Именно g_free(), а не free(), потому что память выделяется через g_malloc();
Получается, что неявное выделение памяти с одной стороны облегчает программирование,
позволяет экономить память, выделяя именно столько, сколько нужно
и предотвращает возможные переполнения буферов, что повышает безошибочность работы программы;
но с другой стороны, с большей выроятностью может приводить к утечкам памяти, если забыть выполнить g_free().


Вы наверное уже заметили, что функции из библиотеки Glib начинаются с префикса g_.
Есть ещё множество полезных функций, облегчающих работу со строками:
gchar* g_strdown(gchar *str); // перевод строки в нижний регистр
gchar* g_strup(gchar *str); // перевод строки в верхний регистр
gchar* g_strreverse(gchar *str); // инверсия регистра в строке

Хотя здесь есть небольшая тонкость, GTK+ использует кодировку UTF8,
а это мультибайтная кодировка, одному символу может быть сопоставлено 1 или 2 байта.
Поэтому для более корректной работы со строками на национальных языках лучше использовать
функции с префиксом g_utf8:
gchar* g_utf8_strup (const gchar *str,gssize len);
gchar* g_utf8_strdown (const gchar *str,gssize len);
gchar* g_utf8_strreverse (const gchar *str,gssize len);

Новый параметр len - это длина текста, но если написать -1, то будет считается,
что строка заканчивается нулём и длина будет высчитана автоматически внутри функции.
Кстати, это очень часто применяемое правило,  использовать -1, как величину по умолчанию.

Все эти функции создают новые строки на базе старых, поэтому надо помнить,
что после использования, строки должны быть удалены с помощью g_free().


Ещё очень удобная функция:
gchar** g_strsplit (const gchar *string, const gchar *delimiter,gint max_tokens);

Которая разбивает исходную строку string на несколько подстрок используя разделитель delimiter,
max_tokens - максимальное количество подстрок, но если max_tokens меньше 1, то строка разбивается до конца.

Также есть функция, которая выполняет полностью противоположную операцию,
то есть объединяет подстроки в одну строку: gchar* g_strjoin(const gchar *separator,...);
При этом не нужно высчитывать сколько места займёт новая строка, память выделится
для новой строки в нужном количестве и автоматически.


Функция void g_strfreev(gchar **str_array); освобождает память, выделенную для подстрок.

Пример использования:

int   i=0;
gchar *regions="Костромская обл.;Ярославская обл.;Тверская обл.;Ивановская обл.";
gchar **substr = g_strsplit(regions,";",-1);// разбиваем строку
while(substr[i])
{
   printf("%s\n",substr[i]);
   i++;
};
g_strfreev(substr);

В итоге названия областей будут напечатаны по отдельности в столбик.


 


В избранное