Есть ли функция стирания первой части и передвижения оставшейся на стертую,на начало допустим xxxxRAZDELITELxxxxx я затер первые X и стало 0000RAZDELITELxxxx и функция сдвигает до RAZDELITELxxxx на нули . Вроде это функция ltrim и rtrim но чего то они у меня не работают.
ltrim, rtrim и trim удаляют из строки крайние пробелы. Чтобы подвинуть часть строки, можно использовать memmove или strcpy
strcpy да я думал об этом но просто этот буфер накопитель ,и постепенно спереди стирается часть , но когда я скопирую допустим то что надо оставшийся кусок затереть ведь сзади ,тоесть обнулить буфер а если у меня будет одновременно добавление то затирается то что добавилось или не туда добавляется ,тогда делать симофор ,но тогда это уже медленнее в скорости , есть мозет альтернативные методы
calidus 1. для чего тебе затирать после копирования заднюю часть буфера? Какая необходимость в этом? strcpy поставит в конце строки ноль. Этого одного нолика достаточно, чтобы функции работы со строками остановились на этом нолике и дальше не лезли в конец буфера. Т.е. хвост буфера после ноля, вставляемого strcpy, будет невидим для строковых функций. И не нужно ничего сзади обнулять, тратя на это время. 2. если всё-таки жизненно необходимо затереть нулями хвост буфера, то после копирования определи длину строки, и начиная от конца этой строки до конца буфера залей нулями при помощи RtlZeroMemory P.S. Кроме того, если тебе важна скорость, может исключить обнуление передней части? Просто запомнить длину, на которую необходимо сдвинуть строку.
Можно сделать примерно так: Код (Text): shift_string proc push esi push edi ;поиск первого ненулевого (начала строки) lea esi,buffer mov edi,esi dec esi @@: inc esi cmp byte ptr[esi],0 je @B ;перенос строки в начало буфера mov ecx,edi add ecx,sizeof buffer @@: mov al,[esi] mov [edi],al inc esi inc edi test al,al jnz @B ;заполнение нулями хвоста буфера @@: mov byte ptr[edi],0 inc edi cmp ecx,edi jne @B pop edi pop esi ret shift_string endp
MSoft Памперсы вам помогут ... mov al,[esi] mov [edi],al inc esi inc edi выполняется заметно быстрее, чем lodsb/stosb. А судя по посту #3 скорость приорететнее, чем размер. P.S. Например на моем процессоре цикл с mov al[esi] выполняется на 60% быстрее, чем цикл с lodsb. (208 тиков против 337 на строке длиной 60 символов)
а тоже выполняется быстрее, чем Код (Text): xor eax,eax @@: scasb jnz @B ? П.С.: это ты сам замерял скорость? или по справочнику смотрел? жутко хочеца заглянуть в справочник, да шо-то найти его в инете не могу
MSoft цикл с cmp byte ptr[esi],0 быстрее, чем scasb Коль скоро я привел конкретные цифры, то видимо замерял... А справочников и пособий по оптимизации в инете - как грязи. Например, pentopt.pdf А.Фога или IA-32 Intel® Architecture Software Developer’s Manual в трех томах. Ищите.
Ого тут спор ))))))) Спасибо большое ВСем !!!!!!!! Буду пробовать!!!! Так вот , я бы все равно хотел узнать что тогда выполняют команды Ltrim Rtrim ???? или szRemove
Дык уже говорили, что LTrim, RTtrim и Trim удаляют крайние пробелы в строке. Соответственно слева, справа и с обоих концов. szRemove удалает фрагмент строки