Portal SAMP
[Tutorial] Argumentação com strtok - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Guias e Tutoriais (https://portalsamp.com/forumdisplay.php?fid=7)
+--- Tópico: [Tutorial] Argumentação com strtok (/showthread.php?tid=1599)



Argumentação com strtok - SrBlue - 04/09/2021

tutorial de como utilizara a porra do strtok... ( para eu mesmo não esquecer e/ou os outro aprenderem a utilizar! )
strtok serve para achar string após o ESPAÇO " ", a galera utiliza bastante para argumentação ( comum em gm antiga ), mesmo tendo outros concorrentes
como sscanf.


strtok (str1,&index);


exemplo (irei usar strcmp):


Código:
public OnPlayerCommandText(playerid, cmdtext[]){

    new cmd[128];
    new tmp[128];
    new idx;

    comando_cortado = strtok(cmdtext, idx);


    if(strcmp(comando_cortado,"/comado",true)==0){  // jogador usa /comando [argumento1] [argumento2] [argumento3]
         new var1[20];
         new var2[20];
         new var3[20];

         var1= strtok(cmdtext, idx); // var1 vira argumento 1
         var2= strtok(cmdtext, idx); // var2 vira argumento 2
         var3 = strtok(cmdtext, idx); // var3 vira argumento 3


         if(!strlen(var1)){ // comparar o tamanho da string, se for 0 ( nada ) vai retornar printar
                printf("argumento var1 não encontrado!");
         }


         if(!strlen(var2)){
                printf("argumento var2 não encontrado!");
         }


        if(!strlen(var3)){
                printf("argumento var3 não encontrado!");
         }

    }


}


Resumidamente:
o strtok, pega a proxima string depois do espaço.

exemplo:

Código:
new idx=0;
string = "FEIJOADA È MUTO BOM SABIA"
          \/       |  \/  \/   \/
          0        1   2    3    4

strtok(string,idx) = FEIJOADA
strtok(string,idx) = É
strtok(string,idx) = MUITO
strtok(string,idx) = BOM
strtok(string,idx) = SABIA
strtok(string,idx)....



e assim vai, pegando string pós espaço!

ok, porque IDX?
* idx, seria INDEX, seria quantidade de elementos seria para capturar.

exemplo


Código:
new idx = 1

string = "porta samp ok"

strtok(string,idx) = "orta" // index[0]
strtok(string,idx) = "amp" //index[1]
strtok(string,idx) = "" //index[3] // Não apareceu porque exerceu o limite definido no INDEX



resumidamente, o INDEX 0, deixa INFININTO o numero de argumentos,
já INDEX 1, se limite a 2
INDEX 2, se limita a 3
INDEX 3, se limita a 4
...........4................5
..........6................7
......
....
e assim por diante..


Código:
stock strtok(const string[], &index)
{
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
        index++;
    }
    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
        result[index - offset] = string[index];
        index++;
    }
    result[index - offset] = EOS;
    return result;
}