как сделать str_replace в С

Модератор: Модераторы разделов

Junker
Сообщения: 34

как сделать str_replace в С

Сообщение Junker »

Пишу программу под Gtk на C. Встала задача использовать определенные паттерны с дальнейшим их преобразованием.. Допустим, есть строка:
gchar str[1000] = "this string $ONE";

Мне требуется заменить в строке значение $ONE собственным значением неизвестной длины..
что нибудь вроде:
str_replace(str,"$ONE","мое значение");
в итоге получилось бы "this string мое значение".
каким образом это можно просто сделать на С или при помощи Glib? может при помощи GString как нибудь..
Спасибо сказали:
Аватара пользователя
Sterh
Сообщения: 42
ОС: Arch Linux, Debian

Re: как сделать str_replace в С

Сообщение Sterh »

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 в С

Сообщение Alxn1 »

А sprintf не подойдет? Если $ONE на %s заменить?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: как сделать str_replace в С

Сообщение drBatty »

сначала найти:
man 3 strstr

потом заменить:
скопировать часть до начала найденного,
скопировать замену
скопировать хвост

man 3 memcpy и man 3 memmove (последнее, если прямо там-же в строке менять).

а можно использовать STL
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Junker
Сообщения: 34

Re: как сделать str_replace в С

Сообщение Junker »

На счет strstr вкурсе. Но надеялся что есть какойто более легкий способ.

Спасибо за советы.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: как сделать str_replace в С

Сообщение drBatty »

Junker писал(а):
08.09.2009 18:47
на C

Junker писал(а):
10.09.2009 11:04
Но надеялся что есть какойто более легкий способ.

на ЧИСТОМ си, насколько я знаю, нет :(
но есть куча готовых велосипедов разной степени мощности. раз GTK, то вроде-бы я такое видел в wxWidget
хотя... ради такой мелочи подключать wx...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: как сделать str_replace в С

Сообщение Portnov »

написать конечный автомат? ;)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Junker
Сообщения: 34

Re: как сделать str_replace в С

Сообщение Junker »

сделал так:
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 в С

Сообщение Alxn1 »

char buffer[4096]; - это когда-нить выстрелит, я уверен :)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: как сделать str_replace в С

Сообщение drBatty »

Junker писал(а):
11.09.2009 22:12
char buffer[4096];

да... лучше переделайте.
есть ведь 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().
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Junker
Сообщения: 34

Re: как сделать str_replace в С

Сообщение Junker »

drBatty писал(а):
14.09.2009 02:28
Junker писал(а):
11.09.2009 22:12
char buffer[4096];

да... лучше переделайте.
есть ведь 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. но в моем случае строки точно не могут превышать данный размер.
Спасибо сказали: