Пишу программу под Gtk на C. Встала задача использовать определенные паттерны с дальнейшим их преобразованием.. Допустим, есть строка:
gchar str[1000] = "this string $ONE";
Мне требуется заменить в строке значение $ONE собственным значением неизвестной длины..
что нибудь вроде:
str_replace(str,"$ONE","мое значение");
в итоге получилось бы "this string мое значение".
каким образом это можно просто сделать на С или при помощи Glib? может при помощи GString как нибудь..
как сделать str_replace в С
Модератор: Модераторы разделов
-
Sterh
- Сообщения: 42
- ОС: Arch Linux, Debian
Re: как сделать str_replace в С
Junker писал(а): ↑08.09.2009 18:47Пишу программу под Gtk на C. Встала задача использовать определенные паттерны с дальнейшим их преобразованием.. Допустим, есть строка:
gchar str[1000] = "this string $ONE";
Мне требуется заменить в строке значение $ONE собственным значением неизвестной длины..
что нибудь вроде:
str_replace(str,"$ONE","мое значение");
в итоге получилось бы "this string мое значение".
каким образом это можно просто сделать на С или при помощи Glib? может при помощи GString как нибудь..
Подойдет?
-
Alxn1
- Сообщения: 402
- Статус: Красноглазик со стажем
- ОС: Mavericks
Re: как сделать str_replace в С
А sprintf не подойдет? Если $ONE на %s заменить?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: как сделать str_replace в С
сначала найти:
man 3 strstr
потом заменить:
скопировать часть до начала найденного,
скопировать замену
скопировать хвост
man 3 memcpy и man 3 memmove (последнее, если прямо там-же в строке менять).
а можно использовать STL
man 3 strstr
потом заменить:
скопировать часть до начала найденного,
скопировать замену
скопировать хвост
man 3 memcpy и man 3 memmove (последнее, если прямо там-же в строке менять).
а можно использовать STL
-
Junker
- Сообщения: 34
Re: как сделать str_replace в С
На счет strstr вкурсе. Но надеялся что есть какойто более легкий способ.
Спасибо за советы.
Спасибо за советы.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: как сделать str_replace в С
на ЧИСТОМ си, насколько я знаю, нет
но есть куча готовых велосипедов разной степени мощности. раз GTK, то вроде-бы я такое видел в wxWidget
хотя... ради такой мелочи подключать wx...
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: как сделать str_replace в С
написать конечный автомат? ;)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
Junker
- Сообщения: 34
Re: как сделать str_replace в С
сделал так:
void str_replace(char *st,const char *orig,const char *repl)
{
char buffer[4096];
char *s = strstr(st,orig);
if (!s) return;
g_strlcpy(buffer,st,strlen(st)-strlen(s)+1);
strcat(buffer,repl);
strcat(buffer,s+strlen(orig));
g_stpcpy(st,buffer);
}
void str_replace(char *st,const char *orig,const char *repl)
{
char buffer[4096];
char *s = strstr(st,orig);
if (!s) return;
g_strlcpy(buffer,st,strlen(st)-strlen(s)+1);
strcat(buffer,repl);
strcat(buffer,s+strlen(orig));
g_stpcpy(st,buffer);
}
-
Alxn1
- Сообщения: 402
- Статус: Красноглазик со стажем
- ОС: Mavericks
Re: как сделать str_replace в С
char buffer[4096]; - это когда-нить выстрелит, я уверен 
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: как сделать str_replace в С
да... лучше переделайте.
есть ведь malloc:
malloc() allocates size bytes and returns a pointer to the allocated memory. The memory is
not cleared. If size is 0, then malloc() returns either NULL, or a unique pointer value
that can later be successfully passed to free().
-
Junker
- Сообщения: 34
Re: как сделать str_replace в С
drBatty писал(а): ↑14.09.2009 02:28
да... лучше переделайте.
есть ведь malloc:
malloc() allocates size bytes and returns a pointer to the allocated memory. The memory is
not cleared. If size is 0, then malloc() returns either NULL, or a unique pointer value
that can later be successfully passed to free().
Да.. согласен.. в принципе надо переделать с malloc. но в моем случае строки точно не могут превышать данный размер.

