Como comparar de maneira certa strings? - Sysner - 27/09/2021
Saudação.
Estou tentando criar um comando que na qual, vou precisa comparar paramentos(strings) no if().
Porém meu código está causando erros ao compilar.
Código: CMD:consumir(playerid, params[]){
new consumivel[10];
sscanf(params, "s", consumivel);
new remedio[] = "remedio", crack[] = "crack";
if(consumivel == remedio){
}
if(consumivel == crack){
}
return 1;
}
// Está causando os seguintes erros
// E:\Servido Roleplay\serve\dm\gamemodes\pvp-style-0-1.pwn(69) : error 033: array must be indexed (variable "consumivel")
// E:\Servido Roleplay\serve\dm\gamemodes\pvp-style-0-1.pwn(73) : error 033: array must be indexed (variable "consumivel")
RE: Como comparar de maneira certa strings? - SrBlue - 27/09/2021
opa,
para fazer comparação de nomes utiliza-se o strcmp
a maneira você está fazendo está verificando se uma var é igual a outra, até mesmo os números de bytes.
o uso correto seria:
if(strcmp(string1,string2,true) == 0){
// é igual
}else{
// não é igual.
}
RE: Como comparar de maneira certa strings? - Sysner - 27/09/2021
(27/09/2021 06:18)SrBlue Escreveu: opa,
para fazer comparação de nomes utiliza-se o strcmp
a maneira você está fazendo está verificando se uma var é igual a outra, até mesmo os números de bytes.
o uso correto seria:
if(strcmp(string1,string2,true) == 0){
// é igual
}else{
// não é igual.
}
Muito obrigado, funcionou.
Tive outro problema quando fui testa.
Quando uso os comandos o console do Samp-Serve diz:
Código: sscanf warning: Strings without a length are deprecated, please add a destination size.
RE: Como comparar de maneira certa strings? - nilat - 27/09/2021
Provavelmente esse comando terá mais produtos para consumo. Recomendo a utilização de switch.
RE: Como comparar de maneira certa strings? - Vel - 27/09/2021
Código: sscanf(params, "s[10]", consumivel);
RE: Como comparar de maneira certa strings? - Carlos Victor - 27/09/2021
Olá, infelizmente o switch no pawn não aceita comparações com strings, apenas integers(int) e char(carácter único, que também não existe no SAMP).
Você tem algumas opções e abaixo estão elas:
1. Usar strcmp, e criar uma estrutura antes do case. E o número que retornar iria utilizar no caso, como exemplo abaixo:
Código: CMD:consumir(playerid, params[])
{
new string[24], itemid;
if(sscanf(params, "s[24]", string))
return SendClientMessage(playerid, -1, "* USE: /consumir [Droga]");
if(!strcmp(string, "maconha", true)) itemid = 1;
if(!strcmp(string, "cocaina", true)) itemid = 2;
switch(itemid)
{
case 1:
{
SendClientMessage(playerid, -1, "* Você usou maconha.");
}
case 2:
{
SendClientMessage(playerid, -1, "* Você usou cocaina.");
}
default: SendClientMessage(playerid, -1, "* Droga invalida, drogas disponiveis: maconha, cocaina.");
}
return 1;
}
2. Usar o strcmp sem o switch, veja o exemplo abaixo:
Código: CMD:consumir(playerid, params[])
{
new string[24];
if(sscanf(params, "s[24]", string))
return SendClientMessage(playerid, -1, "* USE: /consumir [Droga]");
if(!strcmp(string, "maconha", true))
return SendClientMessage(playerid, -1, "* Você usou maconha.");
if(!strcmp(string, "cocaina", true))
return SendClientMessage(playerid, -1, "* Você usou cocaina.");
return 1;
}
3. Usar apenas o switch, veja o exemplo abaixo:
Código: CMD:consumir(playerid, params[])
{
new drogaid;
if(sscanf(params, "d", drogaid))
return SendClientMessage(playerid, -1, "* USE: /consumir [1. Maconha | 2. Cocaina]");
switch(drogaid)
{
case 1:
return SendClientMessage(playerid, -1, "* Você usou maconha");
case 2:
return SendClientMessage(playerid, -1, "* Você usou maconha");
}
return 1;
}
Enfim, são formas que irá te ajudar de qualquer maneira... Desejo boa sorte e caso eu fiz algo errado peço desculpas e peço também que me avise pra eu corrigir.
RE: Como comparar de maneira certa strings? - Sysner - 28/09/2021
(27/09/2021 08:48)Vel Escreveu: Código: sscanf(params, "s[10]", consumivel);
Ajudou, obrigado
(27/09/2021 11:27)Carlos Victor Escreveu: Olá, infelizmente o switch no pawn não aceita comparações com strings, apenas integers(int) e char(carácter único, que também não existe no SAMP).
Você tem algumas opções e abaixo estão elas:
1. Usar strcmp, e criar uma estrutura antes do case. E o número que retornar iria utilizar no caso, como exemplo abaixo:
Código: CMD:consumir(playerid, params[])
{
new string[24], itemid;
if(sscanf(params, "s[24]", string))
return SendClientMessage(playerid, -1, "* USE: /consumir [Droga]");
if(!strcmp(string, "maconha", true)) itemid = 1;
if(!strcmp(string, "cocaina", true)) itemid = 2;
switch(itemid)
{
case 1:
{
SendClientMessage(playerid, -1, "* Você usou maconha.");
}
case 2:
{
SendClientMessage(playerid, -1, "* Você usou cocaina.");
}
default: SendClientMessage(playerid, -1, "* Droga invalida, drogas disponiveis: maconha, cocaina.");
}
return 1;
}
2. Usar o strcmp sem o switch, veja o exemplo abaixo:
Código: CMD:consumir(playerid, params[])
{
new string[24];
if(sscanf(params, "s[24]", string))
return SendClientMessage(playerid, -1, "* USE: /consumir [Droga]");
if(!strcmp(string, "maconha", true))
return SendClientMessage(playerid, -1, "* Você usou maconha.");
if(!strcmp(string, "cocaina", true))
return SendClientMessage(playerid, -1, "* Você usou cocaina.");
return 1;
}
3. Usar apenas o switch, veja o exemplo abaixo:
Código: CMD:consumir(playerid, params[])
{
new drogaid;
if(sscanf(params, "d", drogaid))
return SendClientMessage(playerid, -1, "* USE: /consumir [1. Maconha | 2. Cocaina]");
switch(drogaid)
{
case 1:
return SendClientMessage(playerid, -1, "* Você usou maconha");
case 2:
return SendClientMessage(playerid, -1, "* Você usou maconha");
}
return 1;
}
Enfim, são formas que irá te ajudar de qualquer maneira... Desejo boa sorte e caso eu fiz algo errado peço desculpas e peço também que me avise pra eu corrigir.
Obrigado pelas dicas, vou preferir sem o switch.
|