AMX MOD X
Четверг, 26.12.2024, 15:08:26



Приветствую Вас Гость | RSS
[ Главная ] [ Замена участка строки функцией replace - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
Замена участка строки функцией replace
SinatorДата: Воскресенье, 19.10.2008, 15:17:36 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Не в сети
Всем опять привет )

У меня тут возникли сложности с заменой участка строки... + к этому появились вопросы по функциям... чем отличается функция 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
Репутация: 47
Статус: Не в сети
1) отличаются тем, что replace_all() это стоковая функция, которая использует внутри себя функцию replace(), см. string.inc и изучи сиходники этой функции
2) написать свою фунцию
3) написать свою функцию по аналогии с replace_all(), в которой будет вместо reaplce() использоваться твоя функция из п.2
4) см. п.2
 
DaTaДата: Воскресенье, 19.10.2008, 17:53:50 | Сообщение # 3
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
вот тебе быстрый набросок, только строка 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
Репутация: 0
Статус: Не в сети
Испробовав твой код, нашел оплошность =)

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
Репутация: 16
Статус: Не в сети
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
Репутация: 1
Статус: Не в сети
Насчет самой функции 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
Репутация: 16
Статус: Не в сети
Quote (LtRAT)
вызовет переполнение буффера

никакого переполнения буффера не будет, функция в консоль выдаст ошибку, что строка имеет не достаточный размер.
 
LtRATДата: Понедельник, 20.10.2008, 22:54:08 | Сообщение # 8
Сержант
Группа: Пользователи
Сообщений: 33
Репутация: 1
Статус: Не в сети
Quote (DaTa)
никакого переполнения буффера не будет, функция в консоль выдаст ошибку, что строка имеет не достаточный размер.

это то да (впринципе да, вся информация итп будет целой), но дальше как и при отловленной ошибке, прекратится выполнение функции и нас из нее выкинет...
поэтому и говорю что обращает, но нам от этого не лудше :)
 
hatchДата: Среда, 28.10.2009, 17:02:46 | Сообщение # 9
Сержант
Группа: Пользователи
Сообщений: 37
Репутация: 2
Статус: Не в сети
Народ. Срочно нужно. Ответьте кто-нибудь, кто знает.

Вот такой пример:

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]

Я запарился уже с этим реплейсом.

Code

str[i] = ''

и
Code

str[i] = ""

Не пашут.

Кто что посоветует?
Аська если что: 264984561
З.Ы. Условия 1 и 2 чисто для примера.


Ыыы...

Сообщение отредактировал hatch - Среда, 28.10.2009, 17:11:48
 
PomanoBДата: Среда, 28.10.2009, 18:38:28 | Сообщение # 10
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Мне кажется проще копировать в буфер только цифры, а потом получившуюся строку в исходную скопировать

http://romanov4400.mybrute.com
 
hatchДата: Среда, 28.10.2009, 18:57:44 | Сообщение # 11
Сержант
Группа: Пользователи
Сообщений: 37
Репутация: 2
Статус: Не в сети
Quote (PomanoB)
Мне кажется проще копировать в буфер только цифры, а потом получившуюся строку в исходную скопировать

Блин, лень разбираться щас в этом. Можешь быстренько написать примерный код? ))


Ыыы...
 
PomanoBДата: Среда, 28.10.2009, 19:51:25 | Сообщение # 12
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
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
Репутация: 1
Статус: Не в сети
тоже были проблемы с replace, нашел выход изучив regex. Поищите в поиске на этом форуме мои посты..

стал ощущать рефлексы тоньше, оставаясь как всегда с идеей той же...
 
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024