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? :D

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&#40;id&#41; &#123;    static arg&#91;60&#93;    read_argv&#40;1, arg, charsmax&#40;arg&#41;&#41;        if&#40;equal&#40;arg, "!kick", 5&#41;&#41; &#123;        new target&#91;20&#93;, reason&#91;40&#93;                replace&#40;arg, charsmax&#40;arg&#41;, "!kick ", ""&#41;                 strtok&#40;arg, target, charsmax&#40;target&#41;, reason, charsmax&#40;reason&#41;, ' '&#41;                client_print&#40;id, 3, "target = %s", target&#41;        client_print&#40;id, 3, "reason = %s", reason&#41;                return PLUGIN_HANDLED    &#125;        return PLUGIN_CONTINUE&#125;
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 ?