Работа со строками
Вася, пошёл ты на деревню и в сарай!
и шаблон типа:
%X, пошёл ты на %Y и в %Z !
Нужно извлечь из строки %X,%Y,%Z...
Типа как триггеры в MUD-клиентах.
заранее спасибо.
Имеется строка типа:
Вася, пошёл ты на деревню и в сарай!
и шаблон типа:
%X, пошёл ты на %Y и в %Z !
Нужно извлечь из строки %X,%Y,%Z...
Типа как триггеры в MUD-клиентах.
заранее спасибо.
sscanf(buf, "%s, пошёл ты на %s и в %s !", name, dest1, dest2);
sscanf(buf, "%s, пошёл ты на %s и в %s !", name, dest1, dest2);
Спасибо конечно, но твой пример не будет работать из-за запятой после %s.
Я уже ето пробовал. дело в том, что для использования sscanf надо и шаблон и строку разбить пробелами на паттерны.
%s=%s(%s) << допустим здесь можно разделить
x=sin(y) << а здесь никак :(
а без пробелов не хочет работать собака...
Имеется коммандный интерпретатор с синтаксисом типа
#cmd1 'param1' 'param2'
#cmd2 'param1' 'param2' 'param3'
В его препроцессор вносится обработка шаблонов типа
#proc '%x;%y' //теперь можно писать через ;
%x
%y
#endp
#proc '%x=%y' //оператор присваивания
#math 'tmp' '%y'
#set '%x' '%tmp%'
#endp
таким образом получаем язык с динамическим синтаксисом.
Спасибо конечно, но твой пример не будет работать из-за запятой после %s.
Я уже ето пробовал. дело в том, что для использования sscanf надо и шаблон и строку разбить пробелами на паттерны.
%s=%s(%s) << допустим здесь можно разделить
x=sin(y) << а здесь никак :(
а без пробелов не хочет работать собака...
А что если перед
sscanf(buf, "%s, пошёл ты на %s и в %s !", name, dest1, dest2);
обработать строку, добавив где нужно пробеллы???
А что если перед
sscanf(buf, "%s, пошёл ты на %s и в %s !", name, dest1, dest2);
обработать строку, добавив где нужно пробеллы???
Не, а как именно я узнаю, где нужно ставить пробелы в строке? В этом то всё и дело. Я могу разделить пробелами шаблон, заменяя "%s" на " %s " а вот со СТРОКОЙ проблема. например:
шаблон
if {%s}={%s} then {%s} # Всё понятно
строка
if {tg(49)}={sin(49)/cos(49)} then {goto b} #куда ставить пробел?
Не, а как именно я узнаю, где нужно ставить пробелы в строке? В этом то всё и дело. Я могу разделить пробелами шаблон, заменяя "%s" на " %s " а вот со СТРОКОЙ проблема. например:
шаблон
if {%s}={%s} then {%s} # Всё понятно
строка
if {tg(49)}={sin(49)/cos(49)} then {goto b} #куда ставить пробел?
Попробуй регулярные выражения. CAtlRegExp. Хотя размышляя чисто теоретически( не вникая в постановку задачи ), я бы сделал парсер на основе паттерна StateMachine, с динамическими добавляемыми состояними.
:)))))))
спасиб за хлопоты. я нашол ответ в исходниках Java MUD Client, и зделал класс. каму это интересно, могу выложить, или пишите mailto:growbox@inbox.ru
А сюда валожить не можешь?
Я думаю, что многим будет интересно...
Хотя есть и CAtlRegExp
А сюда валожить не можешь?
Я думаю, что многим будет интересно...
Хотя есть и CAtlRegExp
Конечно же могу...
//-------------------------BEGIN TTRIGGER---------------------------
class TTrigger {
public:
TTrigger() {
//cout << "Class Hash initialized !!!" << endl;
//Cnt=0;
}
~TTrigger() {
//cout << "Class Hash destructed !!!" << endl;
}
int match_a_string(char *line, char *mask);
int check_a_action(char *line, char *action);
int Compilee(char *line, char *action);
int var_len[10];
char *var_ptr[10];
char Argum[MAXARG][MAXC];
int Count;
//int Cnt;
//HashInfo HS[200];
private:
};
TTrigger::match_a_string(char *line, char *mask)
{
char *lptr, *mptr;
lptr=line;
mptr=mask;
while (*lptr && *mptr && !(*mptr=='%' && isdigit(*(mptr+1)))) {
if (*lptr++!=*mptr++)
return -1;
}
if (!*mptr || (*mptr=='%' && isdigit(*(mptr+1)))) {
return (int)(lptr-line);
}
return -1;
}
TTrigger::Compilee(char *line, char *action)
{
if (check_a_action(line,action)==1)
{
for (int i=1;var_len>0;i++)
{
Count = i;
lstrcpyn(&Argum[0],var_ptr,var_len+1);
//printf("Compilee: %s\n",Argum);
}
return 1;
}
else
{
return 0;
}
}
/***************************************************
* Проверка соответствия строки триггеру
***************************************************/
TTrigger::check_a_action(char *line, char *action)
{
/*--1--*/
//int var_len[10];
//char *var_ptr[10];
/*--1--*/
char result[MAXC];
char *temp2, *tptr, *lptr, *lptr2;
int i,flag_anchor, len, flag;
for (i=0; i<10; i++) var_len=-1;
flag_anchor=FALSE;
lptr=line;
//substitute_myvars(action,result);
lstrcpy(&result[0],action);
tptr=result;
if(*tptr=='^') {
tptr++;
flag_anchor=TRUE;
/* CHANGED to fix a bug with #action {^%0 foo}
* Thanks to Spencer Sun for the bug report (AND fix!)
if (*tptr!=*line)
return FALSE;
*/
}
if (flag_anchor) {
if ((len=match_a_string(lptr, tptr))==-1)
return FALSE;
lptr+=len;
tptr+=len;
}
else {
flag=TRUE;
len=-1;
while(*lptr && flag) {
if((len=match_a_string(lptr, tptr))!=-1) {
flag=FALSE;
}
else
lptr++;
}
if (len!=-1) {
lptr+=len;
tptr+=len;
}
else
return FALSE;
}
while(*lptr && *tptr) {
temp2=tptr+2;
if (!*temp2) {
var_len[*(tptr+1)-48]=strlen(lptr);
var_ptr[*(tptr+1)-48]=lptr;
return TRUE;
}
lptr2=lptr;
flag=TRUE;
len=-1;
while(*lptr2 && flag) {
if ((len=match_a_string(lptr2, temp2))!=-1) {
flag=FALSE;
}
else
lptr2++;
}
if (len!=-1) {
var_len[*(tptr+1)-48]=lptr2-lptr;
var_ptr[*(tptr+1)-48]=lptr;
lptr=lptr2+len;
tptr=temp2+len;
}
else {
return FALSE;
}
}
if (*tptr)
return FALSE;
else
return TRUE;
}
//-------------------------------END TTRIGGER---------------------------------
Была тут небольшая проблема с инетом, но теперь всё на полном позитиве АДСЛ+Спутник рулит!
Конечно же могу...
//-------------------------BEGIN TTRIGGER---------------------------
<skip>
<skip>
<skip>
//-------------------------------END TTRIGGER---------------------------------
Если бы ты писал на С++ код был бы более читабелен, а главное корректен.
Если бы ты писал на С++ код был бы более читабелен, а главное корректен.
А это тебе чо паскаль что-ли? Или может быть модула-2? Если ты, обожравшись колёс не можешь определить язык, на котором написан код, в этом виноват только ты, и никто другой.
А это тебе чо паскаль что-ли? Или может быть модула-2? Если ты, обожравшись колёс не можешь определить язык, на котором написан код, в этом виноват только ты, и никто другой.
Спокойнее! А то я уж подумываю, что кроме культуры программирования ты не обладаешь и культурой общения.
Тот уродственный код, который ты представил, написан на жалком гибриде С и С++.
Доказательства?
1. В С++ вопределении методов нужно указывать возвращаемый тип.
2. В С++ вместо массивов, размерность которых взята с потолка, используются контейнеры.
3. В С++ вместо символьных массивов используется класс std::string.
4. В С++ для операций со строками используются методы std::string.
5. В С++ преобразование типов используются конкретные кастинг-операторы.
6. В С++ не чередуются использование std::cout и printf.
В С++ вообще желательно использовать std::cout.
Ну и т.д.
Ну и мои замечания:
1. Вместо закомментирования/раскоментирования отладочных строк, можно применять директивы предкомпилятора.
2. Данные класса лучше делать закрытыми.
3. Если уж передавать char* в методы, то уж const char*
4. Трудночитаемый код, особенно в части условий.
5. Слишком длинные, разветвленные методы. Я бы их нарезал на более мелкие логически законченные.
5. Лучше придерживаться одного стиля именования (переменных, методов и т.п.).
6. FALSE и TRUE, как-то не увязывается с int, не лучше ли использовать bool и false и true соотв-но?
7. "Порадовало" вот это:
if (*tptr)
return FALSE;
else
return TRUE;
Ну и т.д.
Уважаю людей которые программируюет не так чтобы работало, а которые следят за стилем, ресурсами, занимаемой памятью, гибкостью , и устойчивости.
Уважаю людей которые программируюет не так чтобы работало, а которые следят за стилем, ресурсами, занимаемой памятью, гибкостью , и устойчивости.
Знаешь, практика показывает, что правильно писать проще всего. Достаточно правильно начать, и продолжать можно будет только также правильно. Как только идешь на компромисс - рано или поздно он вылезет боком.
Спокойнее! А то я уж подумываю, что кроме культуры программирования ты не обладаешь и культурой общения.
* Я просто ненавижу кретинов, которые превращают форумы по программированию в цирк или шоу уродов(как тебе лучше нравится). По видимому желание кого-то обо**ать - это просто попытка самоутвердится или показать себя круче в глазах других. Если это самоцель - иди на udaff.com, или obosr.ru, может быть больше понравится.
Тот уродственный код, который ты представил, написан на жалком гибриде С и С++.
* Ты слишком невнимателен. Я написал, что этот код написал по большей части не я, а автор Java MUD Client. Отличная для своих целей прога, если кто и имел к ней притензии, то только по части недостатка возможностей.
* насчёт чередования cout и printf - как видиш, cout закоментирован, и откуда ты знаеш, закоментирован ли iostream? Опять же невнимательность.
* С чего ты вообще взял, что размерность массивов взята с потолка?
* Я не пытался сделать код удобочитаемым. Лично для меня он понятен, если он трудночитаем для тебя -это твои проблемы.
* Короче, все твои замечания - попытка навязать мне твой стиль программирования. Наверное ты имеешь в\о и гордишся своими оценками в дипломе. Это твоя личная прирогатива, Но мне как и остальным на это глубоко по барабану. Каждый программирует как хочет, тем более если код на 100% работоспособен.
Знаешь, практика показывает, что правильно писать проще всего. Достаточно правильно начать, и продолжать можно будет только также правильно. Как только идешь на компромисс - рано или поздно он вылезет боком.
Freeman, ты чертовски прав. "Программирование по правилам" зачастую накладывает такие рамки, что из-за какой-то мелкой детали приходится переделывать всё заново. ЭТО СОВЕРШЕННО НЕПРОДУКТИВНО.
Была попытка научить грамотно писать.
Знаешь, любой человек стопроцетно поймет и одинаково воспримет фразы
1. Мне понравилось.
2. Афтор пиши исЧо
Но, культурный человек первого способа никогда употреблять не будет.
Я прифигел сам когда увидел int = false/true
УТЕЧКА памяти, и пофигу работает код или нет.
int занимает 4 байта. bool один байт. Чуешь разницу?
Именно из-за таких как ты ВИНДА такая херовая!
Она работает... но все знают КАК она работает.
Не уважаю программистов программирующих и оринтирующихся только на то чтобы работало. Это ЛЕНТЯИ.
Твой код работает, потому что разработчки поставили защиту от дураков.
Ага, тока где же она?
Была попытка научить грамотно писать.
ГЫ :))
2. Афтор пиши исЧо
Да, исЧо да пАбольше писякай сЦ**а!
Я прифигел сам когда увидел int = false/true
мАлАдетс. Здесь ты конечно прав, 3 байта - это очень много. Столько занимает в памяти моё любимое слово из трёх букв - МИР.
Именно из-за таких как ты ВИНДА такая херовая!
Она работает... но все знают КАК она работает.
Дааа! Именно такие как я делают винду такой херовой, чтобы такие как ты горькими слезами обливались, и матерясь на всех подряд спивались с горя, просиживая долгими ночами за мониторами упавших серваков, пока такие как я строят заводы по производству антигемороидальных свечей по 5$ за пачку. И нет бы бросить это дело и проинсталить какую-нибудь там полуось, которая к тому же ещё и дешевле, такие как ты буквально насилуя самих себя ставят новые и новые версии этих мерзких виндов, просаживая всю зарплату на антигемороидальные свечи...
* Я просто ненавижу кретинов, которые превращают форумы по программированию в цирк или шоу уродов(как тебе лучше нравится).
Не ты первый...
Только шоу уродов устраивают тебе подобные.
Один из таких уродцев несколькими постами выше, - твой код.
А уж укрощение тахих уродцев привращается в цирк благодаря ретивости своих авторов.
* Ты слишком невнимателен.
Хорошая отмазка прикрыть криворукость...
* насчёт чередования cout и printf - как видиш, cout закоментирован, и откуда ты знаеш, закоментирован ли iostream? Опять же невнимательность.
А может нечистоплотность автора?
* С чего ты вообще взял, что размерность массивов взята с потолка?
Потому что размерности заданы числовыми литералами, кратными 10, без объяснения перичин и методики расчета.
Докажи обратное... в коде.
Я написал, что этот код написал по большей части не я, а автор Java MUD Client.
* Я не пытался сделать код удобочитаемым. Лично для меня он понятен, если он трудночитаем для тебя -это твои проблемы.
Да нет... это твои проблемы.
Ты выложил код на всеобщее обозрение, будь так бобр, убрать из него своё дерьмо, умыть и причасать, а не валить всё на другого автора.
* Короче, все твои замечания - попытка навязать мне твой стиль программирования.
Это называется "делиться опытом".
Наверное ты имеешь в\о и гордишся своими оценками в дипломе. Это твоя личная прирогатива,
Да все знают, что я тринадцатилетний (вот уже какой год) хАцКеР из Усть-Урюпинска.
Но мне как и остальным на это глубоко по барабану. Каждый программирует как хочет, тем более если код на 100% работоспособен.
Прикинь, если бы все строили самолеты и ядерные станции так, как хочет...
Freeman, ты чертовски прав. "Программирование по правилам" зачастую накладывает такие рамки, что из-за какой-то мелкой детали приходится переделывать всё заново. ЭТО СОВЕРШЕННО НЕПРОДУКТИВНО.
Ага, назыается РЕФАКТОРИНГ.
Очень продуктивно, если не рефакторишь помойку, как у тебя.
Не ты первый...
Только шоу уродов устраивают тебе подобные.
Один из таких уродцев несколькими постами выше, - твой код.
А уж укрощение тахих уродцев привращается в цирк благодаря ретивости своих авторов.
Я вот всё гадаю, чего же ты там обожрался? Помоему это всё-таки была барбитура...
Да нет... это твои проблемы.
Ты выложил код на всеобщее обозрение, будь так бобр, убрать из него своё дерьмо, умыть и причасать, а не валить всё на другого автора.
* Да я ничего на афтора и не валил, алгоритм который он предложил, это именно то, что и было мне нужно. И очень харашо, что он не юзает разные там std::blablabla, ты бы ещё предложил мне МФЦ подключить! Я ваще хочу потом stdlib отключить и всё на чистый API перевести.
* http://jmc.mud.ru/ Здесь сайт афтора этой проги,здесь же лежит полный её исходник. если те не нравицца чото скажи ему об этом.
Это называется "делиться опытом".
Помоему это называется страдать хернёй. Конечно, в коде есть парочка недочётов, но они не настолько существенны, чтобы повлиять на БЫСТРОДЕЙСТВИЕ или ОТКАЗОУСТОЙЧИВОСТЬ.
Да все знают, что я тринадцатилетний (вот уже какой год) хАцКеР из Усть-Урюпинска.
Анекдот в тему:
- У нас сегодня на работе один чел сервак сломал.
- Он чо, хакер?
- Он кретин!
Прикинь, если бы все строили самолеты и ядерные станции так, как хочет...
И строют! Ну конечно, не АЭС, но самолёты строят. А их идеи потом продают за $$$.
Ага, назыается РЕФАКТОРИНГ.
Очень продуктивно, если не рефакторишь помойку, как у тебя.
Очень продуктивно... Переписывать прогу по 10 раз, а если у тя там 10-20К строк?
Я вот всё гадаю, чего же ты там обожрался?
А ты не гадай, и так умственного ресурса на другие вещи в дефиците.
И очень харашо, что он не юзает разные там std::blablabla, ты бы ещё предложил мне МФЦ подключить!
А при чем тут MFC?
Я говорил о С++.
STL является частью стандарта С++, MFC - нет.
Я ваще хочу потом stdlib отключить и всё на чистый API перевести.
:D :D
Помоему это называется страдать хернёй.
Ну чтож делать, если написанная горе-программистами херня, действительно, приводит к страданиям переписывания по-человечески.
Конечно, в коде есть парочка недочётов, но они не настолько существенны, чтобы повлиять на БЫСТРОДЕЙСТВИЕ или ОТКАЗОУСТОЙЧИВОСТЬ.
А как на счет читабельности и рациональности?
Очень продуктивно... Переписывать прогу по 10 раз, а если у тя там 10-20К строк?
С опытом ты поймешь, что продуктивно.
Мда!!!!! Вот и выложил человек прогу на всеобщее обозрение!!!! :)
Все притензии к вовке))) Это он попросил=))))))):D :D :D :D
char buf[256];
sprintf(buf, c, "Саня", "дерево", "сарай");
AfxMessageBox(buf);
Задачу решает
char buf[256];
sprintf(buf, c, "Саня", "дерево", "сарай");
AfxMessageBox(buf);
Не решает. Эффект должен быть как раз таки обратным.
Мда!!!!! Вот и выложил человек прогу на всеобщее обозрение!!!! :)
Дело то не в программе, а в хамстве, которое он выставил на всеобщее обозрение.
Все притензии к вовке))) Это он попросил=)))))))
Вовка, а самому чё, слабо?
Дело то не в программе, а в хамстве, которое он выставил на всеобщее обозрение.
Помоему в форуме обсуждаются не личности а програмиирование на Ц++... Ах, да! Ты видимо тоже допёр до этого факта, и решил абасрать не меня, а прогу. Ей-то это абсолютно похер, она работает и кушать не просит, впрочем как и мне. Если хамство и имело место быть, то оно есть продукт вашего хамства\наглости. Единственное путное и чем-то обоснованное замечание это про int=true/false, за него спасибо, уже исправлено. Исчо раз насчёт херовости виндов: на самом-то деле в ненавистном мелкософте работают люди не такие как я, и даже не такие как ты, а программисты высшего класса, которые досканально знают язык и всю виндовую архитектуру, вплоть до вызовов аппаратных прерываний. Но даже всего их персонала вместе с бетатестерами не хватит, штобы исправить все многочисленные уязвимости. Никсы со своим опенсаурсом с самого начала завоевали статус надёжных платформ, потому что миллионы админов каждый день вносят в это свою лепту. Все помнят тот самый msblast, который появился после того как у МС скомуниздили часть кода Вин2к. Причина заглюченности винды - исключистельно экономическая политика руководства МС. Смирившись с этим фактом, хочу сказать, что задача таких форумов как этот - исправлять глюки винды, а не кидаться замечаниями типа "сколько соли вы положили в мой кофэ?". 3D Bob, если автор твоего любимого QIP-сексуальный маньяк, ты же не будеш писать ему в саппорт. Если нормально, без высокомерия общаться, то никто не будет хамить, а тут кинул, понимаеш пару строчек НЕ СВОЕГО, к томуже кода и понеслась п***а по кочкам.
Green, вудь всё-таки осторожен, ибо до добра не доводит барбитура.
Помоему в форуме обсуждаются не личности а програмиирование на Ц++... Ах, да! Ты видимо тоже допёр до этого факта, и решил абасрать не меня, а прогу. Ей-то это абсолютно похер, она работает и кушать не просит, впрочем как и мне. Если хамство и имело место быть, то оно есть продукт вашего хамства\наглости. Единственное путное и чем-то обоснованное замечание это про int=true/false, за него спасибо, уже исправлено. Исчо раз насчёт херовости виндов: на самом-то деле в ненавистном мелкософте работают люди не такие как я, и даже не такие как ты, а программисты высшего класса, которые досканально знают язык и всю виндовую архитектуру, вплоть до вызовов аппаратных прерываний. Но даже всего их персонала вместе с бетатестерами не хватит, штобы исправить все многочисленные уязвимости. Никсы со своим опенсаурсом с самого начала завоевали статус надёжных платформ, потому что миллионы админов каждый день вносят в это свою лепту. Все помнят тот самый msblast, который появился после того как у МС скомуниздили часть кода Вин2к. Причина заглюченности винды - исключистельно экономическая политика руководства МС. Смирившись с этим фактом, хочу сказать, что задача таких форумов как этот - исправлять глюки винды, а не кидаться замечаниями типа "сколько соли вы положили в мой кофэ?". 3D Bob, если автор твоего любимого QIP-сексуальный маньяк, ты же не будеш писать ему в саппорт. Если нормально, без высокомерия общаться, то никто не будет хамить, а тут кинул, понимаеш пару строчек НЕ СВОЕГО, к томуже кода и понеслась п***а по кочкам.
Green, вудь всё-таки осторожен, ибо до добра не доводит барбитура.
Откуда тебе знать мой уровень?
При чем тут MS и пр.? Давай тогда уж и мир во всем Мире приплетем...
Дальнейшее обсуждение считаю бессмысленным в виду отсутствия креатива.
М-да.. в этом топике было спорить совсем неинтересно в виду некомпетенстности опонента... Ни одного факта сплошное хамство и мусор...
Вздумаешь отвечать, придумай что-нибудь ближе к первоначальной теме.
P.S. По поводу программистов из MS, поверь далеко не все там "досканально знают язык". Я видел (и программистов и код), я знаю.
....
//----------------------------------------------------
//кусок из класса
...
protected:
string_list m_lsFiles;
...
//----------------------------------------------------
//реализация функции этого класса
...
TCHAR szFile [MAX_PATH];
...
uNumFiles = DragQueryFile ( hdrop, 0xFFFFFFFF, NULL, 0 );
for ( UINT uFile = 0; uFile < uNumFiles; uFile++ ){
if ( 0 == DragQueryFile ( hdrop, uFile, szFile, MAX_PATH )) continue;
if ( PathIsDirectory ( szFile )) continue;
m_lsFiles.push_back( szFile ); //Здесь ошибка
}
...
//----------------------------------------------------------------
выдаёт ошибку
" error C2664: 'std::list<_Ty>::push_back' : cannot convert parameter 1 from 'const char *' to 'std::basic_string (__cdecl &)(TCHAR)' "
самое интересное что в 6-ке работает нормально...
в семёрке выдаёт ошибку...
собсно вопрос...
почиму в 6-ке работает? и как сделать что бы и в 7-ке заработало...