Portal SAMP
[Ajuda] Como comparar de maneira certa strings? - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Como comparar de maneira certa strings? (/showthread.php?tid=1665)



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.