Dudas con Strcmp()
#1

Muy buen dнa a todos, ya mucho sin postear algo en el foro, pero empiezo a meterme mбs a fondo en pawn, poco a poco algo nuevo se va aprendiendo, no me considero un programador avanzado, dado a que aъn hay muchнsimas mбs cosas que no se.

Y este post, dirй algunas de ellas, si me las puede resolver, ЎQuй gusto!.

Dado a que aъn prosigo en la creaciуn del Freeroam (Mi proyecto), Antes de pasar a la secciуn entera de los callbacks, quiero que me quede claro lo siguiente, ya que la wiki sуlo da 2 ejemplos, usando strtok & no usando.

No sabrй como darme a explicar lo siguiente.



  • Funciones usando if(strcmp)


pawn Код:
if (!strcmp("/laseron", cmdtext, true))
  • їPorquй en йsta funciуn, antes de "strcmp" se usa un "!"?

pawn Код:
if (strcmp( cmdtext, "/kill", true))
  • їPorquй en esta funciуn, "cmdtext" va antes del comando escrito?
pawn Код:
if (strcmp( cmdtext, "/colores", true) == 0)
  • їPorquй acб se usa un " == 0)" y en casos varнa el valor?
  • En ambos casos,їPorquй se usa en unos cmdtext & en otros sуlo cmd?
pawn Код:
if (strcmp("/reglas", cmdtext, true, 10) == 0)
  • їPorquй acб se agregan la cantidad de caracteres del comando + == 0?
&
  • їPorquй cmdtext ahora se usa despuйs a comparaciуn del 1er comando?


No me considero un buen scripter, mбs sin embargo, de los errores se aprende, prefiero no quedarme con la duda, a hacer todo mal & al ъltimo se le critique al trabajo.

Si pueden ayudarme, ЎMil gracias!.

Quizбs no me di a entender, si por ahн hay una forma de aprender esto, sin explicar cada cosa, le agradecerнa a aquйl que me lo facilitara





Reply
#2

strcmp es de string comparate (?) o algo asн xD, 0 ingles. Pero lo que hace es comparar dos strings.

El orden no altera el producto (?), por lo tanto, Comparar cmdtext con /kill es lo mismo que comparar /kill con cmdtext.

El !, cumple la misma funciуn que == 0. Por lo tanto, si pones uno, no es necesario el otro.

Lo del CMD es por lo del strtok, pero no tiene porquй ser cmd, puede ser PENE

new pene[256], idx;
pene = strtok(cmdtext, idx);
if(!strcmp(pene, "/kill", true))

Creo que eran esas las dudas, si no eran, decime porque no entendн un corno xD
Reply
#3

Quote:
Originally Posted by [J]ulian
Посмотреть сообщение
El !, cumple la misma funciуn que == 0. Por lo tanto, si pones uno, no es necesario el otro.

Lo del CMD es por lo del strtok, pero no tiene porquй ser cmd, puede ser PENE

new pene[256], idx;
pene = strtok(cmdtext, idx);
if(!strcmp(pene, "/kill", true));
Jaja, un poco de humor en programaciуn no esta mal e.e

Mil gracias, creo haberte entendido perfectamente aunque no entendнas un corno de que hablaba xD

Saludos!

P.D Tanto post para algo simple xd lol

EDIT: Otra cosa xD Lo ъltimo del post, їPorquй en la funciуn que me diste con "!" no se cuentan los caracteres como en la ъltima?
Reply
#4

Ahн justo habнa editado:

"strcmp es de string comparate (?) o algo asн xD, 0 ingles. Pero lo que hace es comparar dos strings."
Reply
#5

Quote:
Originally Posted by [J]ulian
Посмотреть сообщение
Ahн justo habнa editado:

"strcmp es de string comparate (?) o algo asн xD, 0 ingles. Pero lo que hace es comparar dos strings."
Entonces si usamos la funciуn contando caracteres o no es igual? ._.
Reply
#6

їQuй dices?
Strcmp funciona de la manera de que compara las dos cadenas que tъ has escogido. Entonces de cada cadena se borra una letra hasta que todas sean iguales, si no, se detiene y returna el valor que queda, por ejemplo.
pawn Код:
hola
ola

La 'a', luego la 'l' luego la 'o'. Pero la 'h' no estб, asi que returna el valor que quedaba.

Segundo ejemplo:
hola
hola

La 'a', luego la 'l', luego la 'o', luego la 'h'. No quedan letras, returna cero.
Es decir, que el == 0 se agrega si el resultado de esa comparaciуn es cero (todas las letras comparadas son iguales). De igual manera que poner el signo contrario '!', si strcmp returnarнa cero en este caso no.

Por lo tanto, es un error comъn de los novatos hacer esto:
pawn Код:
new szName[24+1];
GetPlayerName(playerid, szName, 24+1);
if (strcmp(szName, "Lunnatiicz"))
{
    return SendClientMessage(playerid, -1, "Lunnatiicz");
}
Y se preguntan porque su cуdigo no funciona (strcmp returnarнa cero si las dos strings son iguales).

pawn Код:
new szName[24+1];
GetPlayerName(playerid, szName, 24+1);
if (strcmp(szName, "Lunnatiicz") == 0)
{
    return SendClientMessage(playerid, -1, "Lunnatiicz");
}
El caso correcto serнa el de arriba ya que se especifica si el valor es cero (lo que returna strcmp si las dos cadenas comparadas son iguales).

Es por eso que en los comandos strcmp (los cuales son obsoletos, viejos, lentos, o como los querais llamar) funcionan asн:
pawn Код:
if (strcmp( cmdtext, "/hacermeadmin", true) == 0)
// cmdtext es el valor dado a OnPlayerCommandText, es una cadena que es igual a el comando que escribe.
// true es ignorar diferencia de mayъsculas y minъsculas
// == 0 es que si el valor es cero (toda la cadena comparada es igual) hacer algo.
Rбpidamente te digo que no es necesario poner la cantidad de carбcteres (y la mayorнa de la gente siempre pone diez) ya que al tener comandos muy largos puede causar malfuncionamiento.

Espero haberte ayudado.
Reply
#7

Perfecto Admantis.

Gracias e.e
Reply
#8

De nada. He editado mi post con un poco mбs de informaciуn.
Reply
#9

Dado a lo ъltimo que dijiste, entonces.

pawn Код:
if (strcmp( cmdtext, "/hacermeadmin", true) == 0)
Serнa igual a

pawn Код:
if (!strcmp( cmdtext, "/hacermeadmin", true))
O:

Asн les entendн a Julian & a ti xD
Reply
#10

pawn Код:
if(strcmp("/reglas", cmdtext, true) == 0)
Es lo mismo que:
pawn Код:
if(!strcmp("/reglas", cmdtext, true))
0 o cero es como un valor nulo, si vale 1 o -1 ya no lo serб.

"/reglas" puede ir asн:
pawn Код:
if (strcmp("/reglas", cmdtext, true, 10) == 0)
o asн:
pawn Код:
if (strcmp(cmdtext, "/reglas", true, 10) == 0)
Para el uso que se le da es igual, el 10 es el nъmero de caracteres a comparar, por ejemplo:
pawn Код:
if (strcmp("Hola a todos", "Hola", true, 4) == 0)
    {
        print("VERDAD");
    } else print("FALSO");
Eso imprimirнa en la consola:
Quote:

VERDAD

Pero si no especнficas el nъmero de caracteres:
pawn Код:
if (strcmp("Hola a todos", "Hola", true) == 0)
    {
        print("VERDAD");
    } else print("FALSO");
imprimirнa :
Quote:

FALSO

Donde va 'true' es "ignorecase", si es 'false' serб sensible a mayъsculas y estб por defecto en 'false':
pawn Код:
if (strcmp("Hola a todos", "Hola", false) == 0)
Serнa lo mismo quй:
pawn Код:
if (strcmp("Hola a todos", "Hola") == 0)
La funciуn nativa:
pawn Код:
native strcmp(const string1[], const string2[], bool:ignorecase=false, length=cellmax);
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)