Здравствуйте, Константин Ленин, Вы писали:
КЛ>Здравствуйте, xEvgeNx, Вы писали:
EN>>Подскажите!!
EN>>Нужно в строке заменить слова оканчивающиеся на ing на ed . .
КЛ>здесь
Чисто моё имхо, лишнюю библиотеку (тем более что она компилируемая) не надо тащить когда можно воспользоваться чем-нибудь попроще. Про replace уже сказали
Здравствуйте, Константин Ленин, Вы писали:
КЛ>Здравствуйте, xEvgeNx, Вы писали:
EN>>Подскажите!!
EN>>Нужно в строке заменить слова оканчивающиеся на ing на ed . .
КЛ>здесь
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, xEvgeNx, Вы писали:
EN>>Нужно в строке заменить слова оканчивающиеся на ing на ed . .
АТ>Т.е. 'king' надо заменить на 'ked'? Или на просто 'ed'?
rg45 wrote:
> EN>Подскажите!! > > EN>Нужно в строке заменить слова оканчивающиеся на ing на ed . . > > std::string::replace > На русский не переводится, извините
Не пойдёт, оно умеет толкьо символы заменять, подстроки не умеет.
boost::string_algo
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kan_izh, Вы писали:
_>rg45 wrote:
>> EN>Подскажите!! >> >> EN>Нужно в строке заменить слова оканчивающиеся на ing на ed . . >> >> std::string::replace >> На русский не переводится, извините _>Не пойдёт, оно умеет толкьо символы заменять, подстроки не умеет. _>boost::string_algo
Да, соврал, малость, извиняйте .
Надо было сказать:
std::string::find,
std::string::erase и
std::string::insert,
но это уже конечно не так элегантно.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Chipsеt, Вы писали:
C>Чисто моё имхо, лишнюю библиотеку (тем более что она компилируемая) не надо тащить когда можно воспользоваться чем-нибудь попроще. Про replace уже сказали
Поддерживаю
ИМХО бустом часто злопуотребляют.
--
Справедливость выше закона. А человечность выше справедливости.
Chipsеt wrote:
> EN>>Нужно в строке заменить слова оканчивающиеся на ing на ed . . > КЛ>здесь <http://boost.org/libs/regex/doc/index.html> > Чисто моё имхо, лишнюю библиотеку (тем более что она компилируемая) не > надо тащить когда можно воспользоваться чем-нибудь попроще. Про replace > уже сказали
Для данной задачи regex использовать, конечно, не надо. std::string::replace тебе не подойдёт. А boost::string_algo не
требует компиляции.
По-моему, чем раньше начнёшь использовать буст, тем меньше велосипедов изобретёшь.
Тем более, давно пора большую часть буста в стандарт засунуть.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kan_izh, Вы писали:
_>Chipsеt wrote:
>> EN>>Нужно в строке заменить слова оканчивающиеся на ing на ed . . >> КЛ>здесь <http://boost.org/libs/regex/doc/index.html> >> Чисто моё имхо, лишнюю библиотеку (тем более что она компилируемая) не >> надо тащить когда можно воспользоваться чем-нибудь попроще. Про replace >> уже сказали _>Для данной задачи regex использовать, конечно, не надо. std::string::replace тебе не подойдёт. А boost::string_algo не _>требует компиляции.
_>По-моему, чем раньше начнёшь использовать буст, тем меньше велосипедов изобретёшь.
Я против буста? Я его использую примерно так-же как и STL. Просто не надо перебарщивать. Зачем писать кучу кода для for_each когда можно обойтись for? Знание буста это так-же и знание где какие части его надо/не надо применять. _>Тем более, давно пора большую часть буста в стандарт засунуть.
Здравствуйте, kan_izh, Вы писали:
>> std::string::replace >> На русский не переводится, извините
_>Не пойдёт, оно умеет толкьо символы заменять, подстроки не умеет.
Да кто Вам сказал подобное?
std::string::find + std::string::replace
#include <string>
using namespace std;
int main()
{
string s1 = "king king";
string s2 = "ing";
for (;;)
{
size_t pos = s1.find(s2);
if (string::npos == pos)
break;
s1.replace(pos, s2.size(), "ed");
}
Можно еще оптимизировать чуть.. Но общий принцип -- показан.
Здравствуйте, kan_izh, Вы писали:
_>boost::string_algo
Если человек уже использует буст в своем проекте -- тогда да... А если, допустим, буст подключать к проекту нежелательно.
Или же это домашнее задание? Вот преподаватель то удивится!
Так что вариантов несколько. Если буст уже в проекте -- тогда string_algo, regex.
Если нет -- что-нибудь из семейства string::find + string::replace..(хотя, конечно, реаллокаций многовато будет)
Натравите этот код на тестовые примеры.
Например, "bringing 'ing'-ending substrings" -> "breded 'ed'-ended substreds"
Его не оптимизировать чуть надо, а дорабатывать напильником.
1) проверять, что "ing" это окончание слова (т.е. перед ним — буква, а после него — не буква)
2) при этом следить за границами контейнера
В строке "ingolstadt to kettering" нельзя проверять
— первый раз isalpha(s1[pos-1])
— второй раз isalpha(s1[pos+3])
Далее,
3) может потребоваться нечувствительность к регистру
4) если искомая и заменяемая строки пересекаются, то поиск
— каждый раз от начала
— строго после точки замены
— строго после точки замены, а когда дойдём до конца строки — вновь с начала
дадут разные результаты. В одних случаях требуется одно, в других другое.
Нельзя сказать, что какой-то из них неправильный.
Здравствуйте, Кодт, Вы писали:
К>Натравите этот код на тестовые примеры. К>Например, "bringing 'ing'-ending substrings" -> "breded 'ed'-ended substreds"
К>Его не оптимизировать чуть надо, а дорабатывать напильником.
Согласен. Код выше был приведен для примера и как ответ на фразу "std::string::replace позволяет заменять только символы, но не подстроки".
К>1) проверять, что "ing" это окончание слова (т.е. перед ним — буква, а после него — не буква)
Первая из проверок может быть и не нужна. Смотря по условиям задачи..
К>2) при этом следить за границами контейнера К>В строке "ingolstadt to kettering" нельзя проверять К>- первый раз isalpha(s1[pos-1])
См. предыдущую фразу. К>- второй раз isalpha(s1[pos+3])
Для упрощения можно добавить пробел в конец строки. К>....
Для этих целей оптимальное решение, имхо, любая regexp библиотека. Другое дело, что перед АТ может стоять задача "с использованием только стандартной библиотеки".