[Tutorial] Uso de Strtok
#1

"
"Uso de Strtok"


Hola, hoy les enseсarй como usar la funciуn Strtok, esencial para distintas funciones, como hacer comandos de administrador.
No se biйn como explicar para que sirve, pero lo intentarй. Strtok sirve para buscar una string y encontrar una variable despuйs de un " " (espacio), y luego devolverlo como una string.
Nota: se que strtok es una funciуn vieja y desoptimizada, de hecho ahora uso sscanf con zcmd. Pero como habнa hecho este tutorial hace mucho tiempo, lo posteo por si alguien le sirve.

Primero que nada, necesitamos poner el cуdigo de strtok.
pawn Код:
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;
}
Veamos por ejemplo, este comando de administrador:
pawn Код:
new cmd[128], idx;
    cmd = strtok(cmdtext, idx);

    if(strcmp(cmd, "/kick", true) == 0)
    {
        new tmp[256]; //Define la string utilizada para el Strtok. En este caso serнa la ID del jugador
        tmp = strtok(cmdtext, idx); //Asocia la string al Strtok

        if(!strlen(tmp)) /Si no se encuentra la id del jugador, pasa lo codeado abajo
                {
                  SendClientMessage(playerid, 0xFFFFFFFF, "Uso Correcto: /Kick [ID del Jugador]");
                }
                else //Si no se cumple lo establecido por el if (en este caso, que no haya escrito la ID del jugador) kikea al jugador
                {
         Kick(strval(tmp)); //Kikea la id
         return 1;
                }
    return 1;  
     }
Todo esta explicado en el code, ahora os enseсarй a hacer un comando usando Strtok.
Primero tenemos que definir lo siguiente, al principio de la callback OnPlayerCommandText
pawn Код:
new cmd[128], idx;
cmd = strtok(cmdtext, idx);
Segundo, empezamos con el comando. En este caso haremos un comando para banear a un usuario
pawn Код:
if(strcmp(cmd, "/ban", true) == 0)
{
Tercero, tenemos que crear la string en la que se guardarб la id del jugador a banear.
pawn Код:
new tmp[256];
tmp = strtok(cmdtext, idx);
Cuarto, vamos a definir lo que pasarнa si no se ingresa la id a banear:
pawn Код:
if(!strlen(tmp))
                {
                  SendClientMessage(playerid, 0xFFFFFFFF, "Uso Correcto: /Ban [ID del Jugador]");
                }
Quinto, ponemos lo que pasarнa si se ingresa la id, en este caso, la funciуn de banear, y terminamos el comando:
pawn Код:
else
 {
   Ban(strval(tmp));
   return 1;
 }
 return 1;
 }
El comando quedarнa asн:
pawn Код:
new cmd[128], idx;
    cmd = strtok(cmdtext, idx);

    if(strcmp(cmd, "/ban", true) == 0)
    {
        new tmp[256];
        tmp = strtok(cmdtext, idx);

        if(!strlen(tmp))
                {
                  SendClientMessage(playerid, 0xFFFFFFFF, "Uso Correcto: /Ban [ID del Jugador]");
                }
                else
                {
         Ban(strval(tmp));
         return 1;
                }
    return 1;  
     }
Listo, eso es todo. Espero que les sirva.
Saludos, Rodro,
Reply
#2

si haces un tutorial de una funcion que no es nativa de samp, minimamente brinda el codigo de la misma.
a menos que hayas editado el codigo de strtok, no puedes usar un array de 128 para almacenar el retorno del mismo, debes usar uno de 256.
no creo que valga la pena realizar un tuto sobre esta funcion, ya que como bien dijiste es vieja y no se usa tanto. lo que se usa ahora es sscanf ya que es mucho mas eficiente
Reply
#3

1- Agregado.
2-Fue un fail mio, ya que estoy acostumbrado a poner los arrays en el menor tamaсo posible, gracias por avisar.
3-Tiene razon, pero bueno, a alguien le servirб.

Gracias por comunicarme mis errores, en otros foros donde publique esos 2 tutoriales nadie me lo ha dicho, asi que lo copiй tal cual lo postie en otros foros.
Reply
#4

son detalles, pero en este caso afecta al funcionamiento (el error del tamaсo) ya que si no, no funcionaria.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)