[Duda] Uso de "if(strlen($) >= sizeof($))"
#1

Tengo un comando de enviar a jail de un servidor Role Play, cuando se exceden en el nъmero de caracteres de bugea todo, por eso se le puso un string de 64, el problema es que "string length", para revisar la longitud no funciona. Da igual lo largo que pongas la razуn, siempre te dejarб usar el "motivo" incluso con 200 caracteres.

Aquн el CMD:

Код:
CMD:jail(playerid, params[])
{
new string[120], time, giveplayerid, reason[64];

       if (Info[playerid][pAdmin] < 2) return SendClientMessageEx(playerid, COLOR_GRAD2, "{FFFF00}[ERROR]:{FFFFFF} No tienes autorizaciуn a usar este comando.");
       if (!sscanf(params, "dds[64]", giveplayerid, time, reason))
	{
            if(IsPlayerConnected(giveplayerid))
	    {
            ///if(strlen(reason) > 64) // Anteriormente estaba asн, pero no funcionaba.
            if(strlen(reason) >= sizeof(reason)) return SendClientMessageEx(playerid, COLOR_GRAD1, "{A2DC35}[INFO]:{FFFFFF} El motivo del jail no puede ocupar mбs de 64 carбcteres.");

		strmid(Info[giveplayerid][pJailedBy], GetPlayerNameEx(playerid), 0, strlen(GetPlayerNameEx(playerid)), MAX_PLAYER_NAME); // Obtener el nombre del que da jail.
		strmid(Info[giveplayerid][pJailReason], reason, 0, strlen(reason), 64); // Obtener el motivo del jail.
		SetPVarInt(giveplayerid, "IsInArena", 0);
		SetPVarInt(giveplayerid, "ArenaMode", 0);
		Info[giveplayerid][pJailed] = 1;
		PhoneOnline[giveplayerid] = 1;
		// Bla, bla. El cуdigo sige, lo simplifico.

            }
	    else SendClientMessageEx(playerid, COLOR_GRAD2, "Esa ID es invбlida.");
        }
	else SendClientMessageEx(playerid, COLOR_GRAD2, "Utiliza: /jail (playerid) (minutos) (razуn)");
        return 1;
    }
El problema es ese, el "if(strlen(reason)" nunca se cumple y permite que la longitud del "motivo" no tenga lнmite alguno, lo que ocasiona el problema de "String buffer Overflow". Usй el "IF" en comandos anteriores y me ha funciona, pero con este CMD no me va, le di mil vueltas y no llego a ver donde estб el problema. Gracias.
Reply
#2

if(strlen(reason) >= sizeof(reason)-1)

y asн tampoco?
Reply
#3

Quote:
Originally Posted by _Zume
Посмотреть сообщение
if(strlen(reason) >= sizeof(reason)-1)

y asн tampoco?
WTF? Me ha funcionado magicamente. Lo probй todo y era poner un "-1", que por cierto, no entiendo el porque de poner el -1 es dejarlo a 63 de string, no? Muchas gracias.
Reply
#4

Pues siempre se comienza a contar desde el string 0, osea que si pones 64 mбs el 0 se sobrepasa, en realidad son del 0 al 63.
Reply
#5

Quote:
Originally Posted by LeonardoEscobar
Посмотреть сообщение
Pues siempre se comienza a contar desde el string 0, osea que si pones 64 mбs el 0 se sobrepasa, en realidad son del 0 al 63.
No es eso, el motivo es que el ъltimo carбcter es un valor NULL (0), por lo que si un string tiene 64 slot, sуlo podrб tener un mбximo de 63 caracteres.

No suelo usar sizeof para string sino mбs bien para arrays normales. Lo que suelo hacer es lo siguiente:

new string[MAX_STRING + 1];

y si eso:

if(strlen(string) == MAX_STRING)

hasta los playername los tengo con + 1:

new playername[MAX_PLAYER_NAME + 1];
Reply
#6

Quote:
Originally Posted by bm0z
Посмотреть сообщение
No es eso, el motivo es que el ъltimo carбcter es un valor NULL (0), por lo que si un string tiene 64 slot, sуlo podrб tener un mбximo de 63 caracteres.

No suelo usar sizeof para string sino mбs bien para arrays normales. Lo que suelo hacer es lo siguiente:

new string[MAX_STRING + 1];

y si eso:

if(strlen(string) == MAX_STRING)

hasta los playername los tengo con + 1:

new playername[MAX_PLAYER_NAME + 1];
Ya, pero como todos los Arrays siempre se puede almacenar datos partiendo desde el espacio 0 (llamandolo criollamente), por ejemplo:

new Array[20];
Podrнas almacenar desde el Array[0] hasta el Array[19], suele ser muy confuso.

Muchas gracias por la aclaraciуn .
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)