|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
Замена участка строки функцией replace
|
|
Sinator | Дата: Воскресенье, 19.10.2008, 15:17:36 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 12
Статус: Не в сети
| Всем опять привет ) У меня тут возникли сложности с заменой участка строки... + к этому появились вопросы по функциям... чем отличается функция replace & replace_all ?? все предположения которые были, оказались неверными =( Вот такая вот задача: Нужно заменить в строке участок (тупо на пустоту =) ) и всё... вот пример кода: Code replace(хххслово, 31, "слово", "") Всё прекрасно работает, после выполнения остаётся только "ххх", но стоит изменить регистр слова и всё.... Code replace(хххСлово, 31, "слово", "") и тут уже не пашет, остаётся "хххСлово".... + хотелось бы узнать НЕ только, как заменять слова без учёта регистра, но еще и что бы заменялось многократное вхождение: Code replace(хххСловоуууСлово, 31, "Слово", "") Что бы тут оставалось "хххууу", а не "хххуууСлово". + как реализовать лучше многократную проверку ? Тоесть что бы в строке заменялось НЕ только "Слово", а допустим еще и "Пример", "Банан" и тд. : Code replace(Слово-Привем-Банан, 31, "тут по идеи масив замены", "") В результате я хочу что бы получалось "---"... А то сейчас я решил проблемы так: 1) многократное вхождение - после замены первый вызывается заного функция в которой это всё происходит и он заного всё проверяет и если есть опять это, то заменяет... мне кажется это не рационально.... 2) Замена многих слов... пришлось на каждое слово писать свой участок когда с выражением if, где проверяется наличие этого слова, и если оно есть то заменяет его... из-за этого код увеличился на 1 экран... =) Тоже мне кажется есть другой, боле рациональный, выход. ПОМОГИТЕ ) ------ Итог: 1) Чем отличаются эти 2 функции. 2) Как удалять строки без учёта регистра 3) Как удалять многократное вхождение слова 4) Как удалять сразу "масив" слов
CS Servers: csp.ty-ta.ru:27015 - Pub#1 csp.ty-ta.ru:27018 - DM csp.ty-ta.ru:27020 - Jump#1
Сообщение отредактировал Sinator - Воскресенье, 19.10.2008, 15:18:54 |
|
| |
slogic | Дата: Воскресенье, 19.10.2008, 16:36:02 | Сообщение # 2 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| 1) отличаются тем, что replace_all() это стоковая функция, которая использует внутри себя функцию replace(), см. string.inc и изучи сиходники этой функции 2) написать свою фунцию 3) написать свою функцию по аналогии с replace_all(), в которой будет вместо reaplce() использоваться твоя функция из п.2 4) см. п.2
|
|
| |
DaTa | Дата: Воскресенье, 19.10.2008, 17:53:50 | Сообщение # 3 |
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| вот тебе быстрый набросок, только строка with[] должна состоять из символов в нижнем регистре(можно strtolower(string[]) ее) Code stock replacei(text[], len, const what[], const with[]) { new iPos = containi(text, what) if( iPos == -1 ) return 0 new iEndPos = iPos + strlen(what) new cOldChar = text[iEndPos] text[iEndPos] = '^0' strtolower(text[iPos]) text[iEndPos] = cOldChar return replace(text, len, what, with) } Добавлено (2008-10-19, 5:53 Pm) --------------------------------------------- переделанный из stiring.inc::replace_all Code stock replacei_all(string[], len, const what[], const with[]) { new pos = 0; if ((pos = containi(string, what)) == -1) { return 0; } new total = 0; new with_len = strlen(with); new diff = strlen(what) - with_len; new total_len = strlen(string); new temp_pos = 0; while (replacei(string[pos], len - pos, what, with) != 0) { /* jump to position after replacement */ pos += with_len; /* update cached length of string */ total_len -= diff; /* will the next call be operating on the last character? */ if (pos >= total_len) { break; } /* find the next position from our offset */ temp_pos = containi(string[pos], what); /* if it's invalid, we're done */ if (temp_pos == -1) { break; } /* otherwise, reposition and update counters */ pos += temp_pos; total++; } return total; }
|
|
| |
Sinator | Дата: Воскресенье, 19.10.2008, 19:17:59 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 12
Статус: Не в сети
| Испробовав твой код, нашел оплошность =) replacei() Code /* ######## # # Функция заменяющая одно вхождение подстроки what на with в строке string длинной len. # ######## */ stock replacei(text[], len, what[], const with[]) { new iPos = containi(text, what) if( iPos == -1 ) return 0 new iEndPos = iPos + strlen(what) new cOldChar = text[iEndPos] text[iEndPos] = '^0' strtolower(what[0]) strtolower(text[iPos]) text[iEndPos] = cOldChar return replace(text, len, what, with) } replacei_all() Code /* ######## # # Функция заменяющая все вхождения подстроки what на with в строке string длинной len. # ######## */ stock replacei_all(string[], len, what[], const with[]) { new pos = 0; if ((pos = containi(string, what)) == -1) { return 0; } new total = 0; new with_len = strlen(with); new diff = strlen(what) - with_len; new total_len = strlen(string); new temp_pos = 0; while (replacei(string[pos], len - pos, what, with) != 0) { /* jump to position after replacement */ pos += with_len; /* update cached length of string */ total_len -= diff; /* will the next call be operating on the last character? */ if (pos >= total_len) { break; } /* find the next position from our offset */ temp_pos = containi(string[pos], what); /* if it's invalid, we're done */ if (temp_pos == -1) { break; } /* otherwise, reposition and update counters */ pos += temp_pos; total++; } return total; } изменил аргумент what с константы на просто в обеих функциях, затем what тоже подверг strlow. А то раньше если replacei_all("NaMe_Here", 31, "_HeRe", "") возращало NaMe_here, так как после занижения строки не совпадали =) А теперь и подстрока в которой нужно изменить и слово которое нужно заменить становятся маленькими =) Добавлено (2008-10-19, 7:17 Pm) --------------------------------------------- Правельно же я сделал ?
CS Servers: csp.ty-ta.ru:27015 - Pub#1 csp.ty-ta.ru:27018 - DM csp.ty-ta.ru:27020 - Jump#1
|
|
| |
DaTa | Дата: Воскресенье, 19.10.2008, 22:44:47 | Сообщение # 5 |
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| Quote (Sinator) Испробовав твой код, нашел оплошность =) ну я ее упоминал, только Quote (DaTa) только строка with[] должна состоять из символов в нижнем регистре *хотел сказать what[] Quote (Sinator) изменил аргумент what с константы на просто в обеих функциях, затем what тоже подверг strlow. ну теперь аргумент what[] не может быть константой, т.е: Code replacei_all("NaMe_Here", 31, [b][i]"_HeRe"[/i][/b], "") вызовет ошибку в строке Code while (replacei(string[pos], len - pos, what, with) != 0) и еще: строка what[] модифицируется.
|
|
| |
LtRAT | Дата: Понедельник, 20.10.2008, 18:19:08 | Сообщение # 6 |
Сержант
Группа: Пользователи
Сообщений: 33
Статус: Не в сети
| Насчет самой функции replace и что ее надо использовать весьма осторожно... такой вот код Code static dff[10]; dff = "123456789";
replace(dff, 9, "9", "10"); вызовет переполнение буффера, тк при замене replace заменяет не обращая внимания на максимальную длину нашего массива... (точней обращает в своем роде, но нам от этого не легче)... А для замены всех включений использую: while( containi(var, "<") != -1 ) replace(var, 129, "<", "<");
|
|
| |
DaTa | Дата: Понедельник, 20.10.2008, 21:37:59 | Сообщение # 7 |
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| Quote (LtRAT) вызовет переполнение буффера никакого переполнения буффера не будет, функция в консоль выдаст ошибку, что строка имеет не достаточный размер.
|
|
| |
LtRAT | Дата: Понедельник, 20.10.2008, 22:54:08 | Сообщение # 8 |
Сержант
Группа: Пользователи
Сообщений: 33
Статус: Не в сети
| Quote (DaTa) никакого переполнения буффера не будет, функция в консоль выдаст ошибку, что строка имеет не достаточный размер. это то да (впринципе да, вся информация итп будет целой), но дальше как и при отловленной ошибке, прекратится выполнение функции и нас из нее выкинет... поэтому и говорю что обращает, но нам от этого не лудше
|
|
| |
hatch | Дата: Среда, 28.10.2009, 17:02:46 | Сообщение # 9 |
Сержант
Группа: Пользователи
Сообщений: 37
Статус: Не в сети
| Народ. Срочно нужно. Ответьте кто-нибудь, кто знает. Вот такой пример: Code ... new i, j, len = strlen(str)
for ( i = 0 ; i < len ; i++ ) { if (!isdigit(str[i]) && (условие_1) && (условие_2)) { replace ( str[i], 1, str[i], "" ) ... Вобщем вопрос. Имеется строка str. Как мне, имея 3 условия, удалить (заменить на "") конкретный символ в этой строке? Т.е. при условии, что итый символ - НЕ цифра - удаляем нафиг этот символ. В итоге в строке должны остаться только цифры. Другими словами: Например из этой строки [asd34+-.56.,177!!!] получить строку [3456177] Я запарился уже с этим реплейсом. и Не пашут. Кто что посоветует? Аська если что: 264984561 З.Ы. Условия 1 и 2 чисто для примера.
Ыыы...
Сообщение отредактировал hatch - Среда, 28.10.2009, 17:11:48 |
|
| |
PomanoB | Дата: Среда, 28.10.2009, 18:38:28 | Сообщение # 10 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Мне кажется проще копировать в буфер только цифры, а потом получившуюся строку в исходную скопировать
http://romanov4400.mybrute.com
|
|
| |
hatch | Дата: Среда, 28.10.2009, 18:57:44 | Сообщение # 11 |
Сержант
Группа: Пользователи
Сообщений: 37
Статус: Не в сети
| Quote (PomanoB) Мне кажется проще копировать в буфер только цифры, а потом получившуюся строку в исходную скопировать Блин, лень разбираться щас в этом. Можешь быстренько написать примерный код? ))
Ыыы...
|
|
| |
PomanoB | Дата: Среда, 28.10.2009, 19:51:25 | Сообщение # 12 |
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Статус: Не в сети
| Code new str[32], i, buffer[32], len = 0 for (i = 0; i < charsmax(str); i++) if (isdigit(str[i])) buffer[len++] = str[i] copy(str, charsmax(str), buffer) // Это необязательно, просто копирование в исходную строку
http://romanov4400.mybrute.com
|
|
| |
Koka | Дата: Среда, 28.10.2009, 21:34:22 | Сообщение # 13 |
Полковник
Группа: Пользователи
Сообщений: 169
Статус: Не в сети
| тоже были проблемы с replace, нашел выход изучив regex. Поищите в поиске на этом форуме мои посты..
стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
|
|
| |
| AMX Mod X Russian Community © 2006-2024 | |
|
| |