Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Вопрос: C++ vs Basic
Добавлено: 21.03.05 18:24
Автор вопроса: Дмитрий Щапов
Ответы
Всего ответов: 127
Номер ответа: 46
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #46
Добавлено: 25.03.05 22:48
Номер ответа: 47
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #47
Добавлено: 26.03.05 01:59
Можно сделать примерно так:
//===============================================
int Replace(char* MainString, char* MatchString, char* NewMatch, int bufferLenght){
LPSTR NewString;
char* StartAddr;
char* InAddr;
int InPosition=0;
int offset=0;
int count=0;
//--если не нашли подстроку - выходим с нулём
if(NULL == (InAddr=strstr(MainString, MatchString))) return 0;
//--выделяем кусок памяти размером входной строки+1------
NewString = (LPSTR)VirtualAlloc(NULL,strlen(MainString)+1,MEM_COMMIT,PAGE_READWRITE );
StartAddr = MainString; //--адрес, начиная от которого ищем---
//--цикл пока есть вхождения подстроки
while(NULL != (InAddr=strstr(StartAddr,MatchString))){
InPosition=InAddr-StartAddr; //-позиция вхождения от стартовой позиции
//--копируем от стартовой позиции до вхождения
memcpy(NewString+offset, StartAddr, InPosition);
//--цепляем новый фрагмент
strcat(NewString, NewMatch);
//--смещаемся по строке---
StartAddr = StartAddr+InPosition+strlen(MatchString);
offset= strlen(NewString);
count++; //--счётчик количества вхождений/замен
}
//--когда все вхождения подстроки заменили на новые
//--цепляем остаток строки
strcat(NewString, StartAddr); //--теперь по адресу NewString - новая строка
//--если она вмещается в старый буфер, то копируем
if (bufferLenght >= strlen(NewString)){
strcpy(MainString, NewString);
}
else {
count = strlen(MainString)-strlen(NewString);
}
//--освобождаем память под временную строку
VirtualFree(NewString,strlen(MainString)+1,MEM_DECOMMIT);
//-- возвращаем count:
//-- если count<0, то вх.буфер был мал, count - сколько не хватило
//-- если >0, то count - кол-во произведенных замен.
return count;
}
//===============================================
char Main[100];
char Match[10];
char NewMatch[10];
int cnt;
strcpy(Main,"Thiis is the old striing"
strcpy(Match,"i"
strcpy(NewMatch,"aaaa"
if (0 <= (cnt = Replace((char*) Main, (char*) Match, (char*) NewMatch, 100))){
MessageBox(hWnd, Main, NewMatch,0);
}
else {
wsprintf(buffer,"%ld",cnt);
MessageBox(hWnd, buffer, "Буфер Main слишком мал", 0);
}
Ф-ция конечно не самая оптимальная, наверное можно и улучшить, как говорится, карты в руки
VirtualAlloc - это конечно "из пушки по воробьям", но в пределах длины строки, кратной 64 кБ проблем не будет. Если в процессе преобразования длина перевалила порог следующего 64 -килобайтного куска, наступит кердык. Кердык можно обрабатывать в обработчике исключений.
Если строка не перевалила порог следующих 64 кБ, проблем нет. Или если она вообще уменьшилась.
Если ф-ция возвращает 0, - искомая строка не найдена в главной строке, > 0 - количество произведенных замен, если < 0 - места во входном буфере мало (возвращает на сколько надо растянуть его, чтобы выходная строка поместилась).
Номер ответа: 48
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #48
Добавлено: 26.03.05 10:38
блин, я Вам говорю, юзайте MFC для этого! Вам очень быстро надоесть кодить на таком низком уровне, CString все делает сам. Я тоже когда-то думал, что лучше через char , но думал я неправильно. MFC здорово облегчает жизнь программисту.
Номер ответа: 49
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #49
Добавлено: 26.03.05 11:10
DaSharm, прекрати рекламировать каку. Если лень писать свой класс для работы со строками, используйте STL, std::string заметно удобнее и быстрее CString
Номер ответа: 50
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #50
Добавлено: 26.03.05 11:29
DaSharm
Пока будешь искать какой-нибудь нужный для работы через mfc .h или ещё чего, можно написать такого рода ф-цию.
Закачал блин пример по работе листвью с базой данных, а там нет двух заголовочных файлов: afxwin.h и afxres.h. Два дня бегал, искал их. Так и не нашёл. За это время можно было сделать свою реализацию
Номер ответа: 51
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #51
Добавлено: 26.03.05 14:57
Номер ответа: 52
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #52
Добавлено: 26.03.05 15:51
Всю VS качать тяжеловато
Скачал psdk и toolkit (2003). Но увы, хотя и 70 с лишним мегов, нет большинства файлов, фигурирующих в примерах
Номер ответа: 53
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #53
Добавлено: 26.03.05 16:47
2cresta: это прикол? afxwin.h и afxres.h стандартные MFC хеадеры.
2Sharp: знаешь, ты напоминаешь мне маленького ребенка, который через свои глупые убеждения делает себе хуже. Но ты не простой блин ребенок, ты и другим хуже хочешь сделать, обзывая MFC говном. MFC - это труд тысяч высококлассных программистов. MFC - это то, что юзают милионы программистов, и радуются этому. Я сам знаю что такое программирование на АПИ и MFC, но я не говорю что одно отстой а другое супер. Всему своё место. Без MFC написание мощной программы с сильным интерфейсом занимает много времени, что нивкакую не нравится заказчикам. Да и вспомни об отладке прог без MFC? Все эти безсонные ночи с отлавливанием утечек памяти...хотя, утечки это только вершина айсберга...
Почему большинство программеров выбирают билдер? Да нет, не потому что тупые, а потому, что они НЕ хотят внось писать написанное. Блин, да перестань ты писать уже свой прогрессбар, таких десятки миллионов уже готовых, что напимали тебе подобные, но успевшие до тебя (ничего личного). Юзай их труд! Без базара, учится нужно (это я про АПИ), но не тогда, когда ты работаешь!
Номер ответа: 54
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #54
Добавлено: 26.03.05 18:28
DaSharm
Знаю, что стандартные, только нет их Где взять?
Номер ответа: 55
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #55
Добавлено: 26.03.05 18:36
Ух ты какое поучение зарядил! Долго в себе копил наверно.
Мда. У меня вышло немного подругому, но полурабочее почемутось.
LPCTSTR replace(const LPCTSTR srcText,const LPCTSTR FindText,const LPCTSTR ReplText){
char *Ret=(char*)srcText;
char *S="";
char *F="";
while (strstr(Ret,(char*)FindText)!=NULL){
F=strstr(Ret,(char*)FindText);
strncat(S,Ret,strlen(Ret)-strlen(F));
strcat(S,ReplText);
strncpy(F,F+2,strlen(F)-strlen(FindText));
strncat(S,F,strlen(F)-strlen(FindText));
Ret=S;
S="";
}
return Ret;
}
Номер ответа: 56
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #56
Добавлено: 26.03.05 19:19
Что значит "полурабочее" ?
Номер ответа: 57
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #57
Добавлено: 26.03.05 19:46
replace("Error $1","$1","13"="Error 13" - всё верно
replace("Error 13 in $2","$2","XModule"="Error 13Error 13 in DXModule" - странно...
Короче хоть он вначале ф-ии призваивает S="";F="" но если посмотреть значение(скажем через MessageBox), то во втором случае уже вначале функции S=F="Error 13"; и я никак не могу это изменить.
Номер ответа: 58
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #58
Добавлено: 26.03.05 20:08
2Dimm:
сразу тебе скажу, что С++ не так проста, как ты думаешь, и твой код содержит много подводных камней:
char *Ret=(char*)srcText;
char *S="";
char *F="";
Во первых, делают так
char *Ret=srcText;
char *S=NULL;
char *F=NULL;
далее, где выделение памяти под новые строки, на которые будет указывать указатель, где уничтожение указателей? это приведет к утечке памяти и будет твоей головной болью не одну ночь (с отладчиком в руках).
http://programmistu.h12.ru/mfc/detail/21.html
Поищи в любом поисковике тему "утечка памяти"
Номер ответа: 59
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #59
Добавлено: 26.03.05 20:11
а не проще юзать CString?
CString a;
a.Replace( ...
Номер ответа: 60
Автор ответа:
Дмитрий Щапов
Вопросов: 71
Ответов: 321
Профиль | | #60
Добавлено: 26.03.05 20:30
char *Ret=srcText; - непойдёт. Тип разный, нужно преобразовать.
Прикольно. Откуда в CString взялась такая менюшка.
но компилятор говорит 'CString' : undeclared identifier. Чего там подключать надо что-ли.