Page 1 of 2
String gavimas
Posted: 2011 May 11 13:31
by addinol
Sveiki, kaip gauti string išskyrus 2 pirmus jo parametrus,
mano string sudaro tarkim.
'!kick addinol uz cheatinima ir kodinima'
noriu gauti 'uz cheatinima ir kodinima'.
Naudoju parse, bet tada gaunu tik atskirus žodžius, arba reikia dėti kabutes "uz cheatinima ir kodinima" įmanoma kaip nors be kabučių ?
Code: Select all
new text[190];read_args(text, sizeof text - 1);remove_quotes(text); new cmd[6], target[32], reason[128];parse(text[1], cmd, sizeof cmd - 1, target, sizeof target - 1, reason, sizeof reason - 1 );
Jei mano string bus !kick addinol uz cheatinima ir kodinima, tai išsiskirstys į:
cmd !kick
target addinol
reason uz
o jei bus !kick addinol "uz cheatinima ir kodinima", tai išsiskirstys į:
cmd !kick
target addinol
reason uz cheatinima ir kodinima
Bet ar įmanoma padaryti, jog tą paskutinį punktą 'reason' gautų visą iki galo, ir nereiktų naudoti kabučių šiuo atveju.
Re: String gavimas
Posted: 2011 May 11 14:42
by aaarnas
Galima mėginti taip:
Code: Select all
new lenght = strlen(message) new param new slot new cmd[48], nick[40], reason[128] for(new i=0; i<lenght; i++) { if(!text[i]) break; if(text[i] == ' ') { param++; slot = i; } switch(param) { case 0: { cmd[i] = text[i] cmd[i+1] = 0 } case 1: { nick[i-slot] = text[i] nick[i-slot+1] = 0 } case 2: { reason[i-slot] = text[i] reason[i-slot+1] = 0 } } }
Re: String gavimas
Posted: 2011 May 11 15:28
by addinol
Tai juk vistiek skaičiuos kaip atskirus parametrus reason žodžius su tarpais
Code: Select all
if(text[i] == ' ') { param++; slot = i; }
Jei bus, Labas rytas sveciai, tai čia bus 3 param
Labas
rytas
sveciai
Re: String gavimas
Posted: 2011 May 11 17:57
by hleV
Code: Select all
new cmd[6], target[32];parse(text[1], cmd, sizeof cmd - 1, target, sizeof target - 1); new reason[128];copy(reason, sizeof reason - 1, text[strlen(cmd) + strlen(target) /*+- 1?*/]); // Gali tekt pasizaist su tuo +-trim(reason);
Re: String gavimas
Posted: 2011 May 11 18:06
by addinol
-1 duoda tokį result:
!kick player uz kodinima ir cheatinima
reason: yer uz kodinima ir cheatinima
+1 duoda tokį result:
!kick player uz kodinima ir cheatinima
reason: r uz kodinima ir cheatinima
o neįmanoma vėl gauti viso string ir replacint '!cmd' ir 'target' su '' ?
Re: String gavimas
Posted: 2011 May 11 18:17
by hleV
Tai blet, nedaėjo pabandyt su
+ 2?

Re: String gavimas
Posted: 2011 May 11 18:20
by newb
Galima dar taip
Code: Select all
public said(id) { static arg[60] read_argv(1, arg, charsmax(arg)) if(equal(arg, "!kick", 5)) { new target[20], reason[40] replace(arg, charsmax(arg), "!kick ", "") strtok(arg, target, charsmax(target), reason, charsmax(reason), ' ') client_print(id, 3, "target = %s", target) client_print(id, 3, "reason = %s", reason) return PLUGIN_HANDLED } return PLUGIN_CONTINUE}
Re: String gavimas
Posted: 2011 May 11 18:23
by addinol
newb wrote:Galima dar taip
Code: Select all
public said(id) { static arg[60] read_argv(1, arg, charsmax(arg)) if(equal(arg, "!kick", 5)) { new target[20], reason[40] replace(arg, charsmax(arg), "!kick ", "") strtok(arg, target, charsmax(target), reason, charsmax(reason), ' ') client_print(id, 3, "target = %s", target) client_print(id, 3, "reason = %s", reason) return PLUGIN_HANDLED } return PLUGIN_CONTINUE}
Dėkui, veikia, turbūt čia geriausias būdas
-- 2011 Geg 11 20:13 --
o jeigų 3 parametrai ir likęs reason ?
tarkim
!ban name time reason
Code: Select all
new target[20], reason[40], bantime[11]; replace(arg, charsmax(arg), "!ban ", "") strtok(arg, target, charsmax(target), bantime, charsmax(bantime), reason, charsmax(reason), ' ')
errorą meta:
Error: Argument type mismatch (argument 6)
Re: String gavimas
Posted: 2011 May 11 20:49
by newb
2 kartus strtok naudot, bet gal ir geresnis budas yra.
Re: String gavimas
Posted: 2011 May 11 20:55
by addinol
o tai kaip antrą kart su tuo strtok gauti, nesuprantu jo kaip jis veikia, pirmą kart naudoju, suprantu tik tiek jog paima iš dešinės string ir iš kairės, daugiau nieko negaudau ;D
ką pirmam strtok'e gauti ir ką antram, pirmam target ir time antram reason ?