Ir para o conteúdo
dario1133

strcmp

Mensagens Recomendadas

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?

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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
}

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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???

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
   }
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);

}

Editado por pmg
explicacao para Java, LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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
}

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.