Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

dario1133

strcmp

Recommended Posts

dario1133

Tenho um vector de caracteres:

static unsigned char buffer[100];

Quero comparar o valor, mas só dos primeiros 4 caracteres

if (strcmp(buffer[3], "0X7E") == 0) {
printf("Mensagem Certa");}

Mas não está a funcionar, alguém pode ajudar?

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

olha para os argumentos da função strcmp :

http://pubs.opengroup.org/onlinepubs/009695399/functions/strcmp.html

int strcmp(const char *s1, const char *s2);

The strcmp() function shall compare the string pointed to by s1 to the string pointed to by s2.

teres buffer[3] não quer dizer os 4 primeiros elementos da string ! quer dizer o elemento na posição 3 da string/lista de caracteres ...

o que pretendes é facilmente realizado com a função strncmp :

http://pubs.opengroup.org/onlinepubs/009695399/functions/strncmp.html


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
dario1133

Já agora qual é a função que permite copiar determinados caracteres de um vector para uma variável?

Por exemplo copiar da posição 5 até à 10 do vector!

Share this post


Link to post
Share on other sites
HappyHippyHippo

tens 5 bolas de ping-pong e uma colher de chã, achas que consegues segurar as 5 bolas ?

nop

para guardares 5 bolas de ping-pong, necessitas de 5 colheres de chã ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
dario1133

Eu tou a receber via porta serie uma mensagem que é uma array de inteiros (Mensagem:12637608255255255255255255255255).

Como faço para comparar a mensagem, mas apenas determinados valores, por exemplo os 3 primeiros?

Obrigado

Share this post


Link to post
Share on other sites
HappyHippyHippo

estás a receber inteiros (bytes com o valor numérico) ou caracteres alpha-numéricos representativos dos números ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo
int message[MAX];
int check[3];

check[0] = 123;
check[1] = 4567;
check[2] = 89012;

if (memcmp(message,               // primeiro bloco de memoria a ser usado na comparacao
          check,                 // segundo bloco de memoria a ser usado na comparacao
          sizeof(int) * 3) == 0) // numero de bytes a serem comparados
{
 // os tres primeiros elemento sao iguais
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

Quantos, e quais, são os inteiros presentes na tua mensagem de exemplo?

Mensagem:12637608255255255255255255255255

12 inteiros: 1, 2, 6, 37, 60, 82, 552, 5525, 52552, 55255, 255255, e 255???

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

tinha um erro no código que apresentei : faltava comparar o resultado da chamada da função com 0


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
dario1133

Pois, já fiz a comparação correctamente, mas agora nunca identifica nenhuma igualdade.

Da mensagem (12637608255255255255255255255255), só quero comparar o 126 que corresponde a 7E, logo será o 1º byte.

Eu fiz:

if (memcmp(mensagem, check, sizeof (int)*1) == 0) {

}

Sendo que:

int check[] = 126;

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
HappyHippyHippo

Da mensagem (12637608255255255255255255255255), só quero comparar o 126

então afinal estás a receber caracteres alpha numéricos !!!!

não foi isso que disseste !!!

estás a receber inteiros (bytes com o valor numérico) ou caracteres alpha-numéricos representativos dos números ?

inteiros (bytes com o valor numérico)

é óbvio que nunca funcionaria !!!

char message[256]; // buffer com os caracteres da mensagem
char tester[256];

sprintf(tester, "126");
if (memcpy(message, tester, 3) == 0)
{
 // os três primeiros bytes são iguais : '1', '2' e '6'
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
dario1133

Mesmo assim não funciona. Em vez do memcpy não será memcmp? Mesmo assim experimentei e não identifica a igualdade!

Share this post


Link to post
Share on other sites
HappyHippyHippo

sim, tens razão, sempre se falou do memcmp e escrevi memcpy por distracção.

agora vamos ao que interessa : ou apresentas o código que tens ou nunca terás uma resposta concreta, isto porque ainda não é claro qual é a informação que que estás a processar ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
dario1133

Numa aplicação em Java estou a mandar uma mensagem para a porta serie. É uma mensagem de teste e é: 12637608255255255255255255255255.

Num micro-controlador estou a receber essa mensagem (testado). Se começar por 126, vou efectuar determinada acção, que neste momento ainda não desenvolvi, porque não consegui ver se a mensagem começa por 126.

void vSerial() {
   static unsigned char vState = 1;
   static int mensagem;

   switch (vState) {
       case 1:
           if (u8SerialReceivedData()) { //pic recebe do pc (java)
               vState = 2;
               mensagem = getch(); // guarda o que recebe
           }
           break;
       case 2:
           if (... comparar para ver se a mensagem começa por 126) {
               vState = 3;
           } else {
               vState = 1;
           }
           break;
       case 3:
           //Começa por 126, Fazer determinada ação
           vState = 1;
           break;
   }
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

assim é impossível ...

dizes que envias uma mensagem ("12637608255255255255255255255255") onde não especificas como codificas isso (se é uma lista de inteiros ou uma lista de char's ...

depois apresentas um código onde a mensagem é um simples inteiro ...

é impossível saber que dados estás realmente a enviar e que dados quer processar

visto que deste modo não se vai a lado nenhum, só existe uma solução :

apresenta o código que foi pedido : o que envia os dados !!!


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
dario1133

Edit: Como pedido, aqui vai o codigo que tenho feito em Java para verificacoes (by pmg)

public void enviar() throws IOException {
 int[] data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
 Mensagem msg = new Mensagem(0x178, false, 8, data);
 String comando = msg.getMensagem();
 bw.write(comando);
 bw.flush();


 System.out.println("Mensagem:" +comando);

}

Edited by pmg
explicacao para Java, LP no GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok, estás a enviar então (presumo novamente porque não existe informação do que a classe Mensagem faz ...) caracteres, ao contrário do que estavas a dizer ...

char message[MAX];
char check[MAX];

sprintf(check, "126");        // gravar os três primeiros bytes/caracteres a serem comparados

/* outra maneira seria: */
check[0] = '1';
check[1] = '2';
check[2] = '6';

if (memcmp(message,           // primeiro bloco de memoria a ser usado na comparacao
          check,             // segundo bloco de memoria a ser usado na comparacao
          sizeof(char) * 3)  // numero de bytes/caracteres a serem comparados
     == 0)
{
 // os tres primeiros elemento sao iguais
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

       int[] data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

Isto não é C.

Achas melhor um moderador mudar o teu tópico para outro quadro?

Edited by pmg
sem efeito

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

Isto não é C.

Achas melhor um moderador mudar o teu tópico para outro quadro?

sim, não é C, mas não estava a ser possível determinar que tipos de dados que a aplicação em Java estava a enviar para que a aplicação em C os receber e processar.

foi essa a razão que pedi para que ele apresentasse o código que tinha em Java, do qual foi confirmado que está correcto.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

    int[] data = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

Isto não é C.

pedi para que ele apresentasse o código que tinha em Java

Ah! Ta bem :)

Alterei o post com codigo Java para que a proxima pessoa que passe pelo topico sem o ler do principio perceba a razao do Java no quadro de C.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.