Здравствуйте, Аноним, Вы писали:
А>например... А>name[strlen(name)] = 'Vasya*' А>Что-бы после васи могло быть все что угодно?!
Я вас не понимаю..
Re[2]: как задать строку?
От:
Аноним
Дата:
06.06.08 10:48
Оценка:
Здравствуйте, php-coder, Вы писали:
PC>Здравствуйте, Аноним, Вы писали:
А>>например... А>>name[strlen(name)] = 'Vasya*' А>>Что-бы после васи могло быть все что угодно?!
PC>Я вас не понимаю..
Ну я сравниваю две строки, при этом в одной VasyaPupkin VasyaPetrov, а в другой нужно задать так, что-бы найти все вхождения после Vasya...
Здравствуйте, Аноним, Вы писали:
PC>>Я вас не понимаю.. А>Ну я сравниваю две строки, при этом в одной VasyaPupkin VasyaPetrov, а в другой нужно задать так, что-бы найти все вхождения после Vasya...
Если я правильно вас понял, что вам нужны регулярные выражения. (Тогда смотрите в сторону PCRE, boost-regex и пр.)
Здравствуйте, Аноним, Вы писали:
А>например... А>name[strlen(name)] = 'Vasya*' А>Что-бы после васи могло быть все что угодно?!
а если не хочется загонятся на boostnj то можно типа тае
Здравствуйте, alexsy, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>например... А>>name[strlen(name)] = 'Vasya*' А>>Что-бы после васи могло быть все что угодно?! A>а если не хочется загонятся на boostnj то можно типа тае A>
Здравствуйте, Аноним, Вы писали:
А>Ну я сравниваю две строки, при этом в одной VasyaPupkin VasyaPetrov, а в другой нужно задать так, что-бы найти все вхождения после Vasya...
Пожалуйста, избавь себя (и нас тоже) от неверного употребления слов.
Это — не сравнение строк.
И как я понимаю, второй строки в постановке задачи вообще нет.
У тебя — задача поиска вхождений подстроки в строке.
// вспомогательная функцияchar const* find_str(char const* text, char const* tag)
{
char const* found = strstr(text,tag);
if(!found) found = text+strlen(text);
return found;
}
// допустим, функция, которую нужно вызыватьvoid process(char const* token, size_t token_length);
// где ищемchar const* const text = "MishaIvanov VasyaPupkin VasyaPetrov PetyaSidorov";
// что ищемchar const* const tag = "Vasya";
size_t const taglen = strlen(tag);
char const* here = find_str(text, tag);
while(*here)
{
char const* there = find_str(here + taglen, tag);
process(here,there-here);
here = there;
}
Будут вызваны функции process() для диапазонов "VasyaPupkin ", "VasyaPetrov PetyaSidorov".
Либо тебе нужно сперва (мысленно) разбить строку на подстроки — скажем, по пробелу — и каждую подстроку проверить.
Ничего сложного:
char const* const separator = " ";
char const* here = text + strspn(text, separator); // пропускаем все разделителиwhile(*here)
{
size_t token_length = strcspn(here, separator); // считаем до первого разделителяif(strncmp(here, tag, token_length)==0) // фильтр
process(here, token_length);
here += token_length;
here += strspn(here, separator);
}
Если прибегнуть к бусту, то задачи разбивки строки на токены и прочее станут выглядеть попроще.
А если не прибегать, то голый сишный код тоже работать будет.
Перекуём баги на фичи!
Re[4]: как задать строку?
От:
Аноним
Дата:
08.06.08 12:07
Оценка:
>У тебя — задача поиска вхождений подстроки в строке.
Да, что-то вроде того.
Вот еще на ум пришло, если в каждом патерне сравнивать первый и последний символ? Вопрос в том, как быстрее всего узнать последний символ? Из сайза?
Здравствуйте, <Аноним>, Вы писали:
>>У тебя — задача поиска вхождений подстроки в строке. А>Да, что-то вроде того. А>Вот еще на ум пришло, если в каждом патерне сравнивать первый и последний символ? Вопрос в том, как быстрее всего узнать последний символ? Из сайза?
Перед тем, как делать "быстрее всего", нужно сформулировать точно задание. Иначе будет быстро и неправильно, и мы ещё поиграем в угадайки — что именно неправильно.
Так что опиши задачу. И желательно, реальную задачу, а не её трансформацию в термины васи-пупкина.
Что за поток текста, что за формат, какие фрагменты нужно вытаскивать...
А уже потом прицепим к нему алгоритмы быстрого поиска.
Кандидатами в алгоритмы являются Кнута-Морриса-Пратта и Бойера-Мура ("узнать последний символ из сайза" — это топорно-велосипедная вариация БМ).