Putchar in una stringa per confronto

di il
12 risposte

Putchar in una stringa per confronto

Salve a tutti
ho necessità di mettere il valore di putchar in una stringa per poi eseguire un confronto.
Come devo fare? ho provato a creare anche un array e mettere i valori dentro...ma nulla...

   char* payloadptr;

    payloadptr = message->payload;
    for(i=0; i<message->payloadlen; i++) {
        putchar(*payloadptr++);
        }
    putchar('\n');
Grazie a tutti

12 Risposte

  • Re: Putchar in una stringa per confronto

    
    
    char* payloadptr;
    payloadptr = message->payload;
    
    while (*payloadptr != '\0')
    {
    	putchar(*payloadptr);
            payloadptr++;
    }
    
  • Re: Putchar in una stringa per confronto

    brugne92 ha scritto:


    
    
    char* payloadptr;
    payloadptr = message->payload;
    
    while (*payloadptr != '\0')
    {
    	putchar(*payloadptr);
            payloadptr++;
    }
    
    Ciao
    grazie mille per la risposta

    ho fatto successivamente
    printf("valore %s\n",payloadptr);
    ma non mi restituisce nulla, e cmq con la putchar mi scrive il contenuto a video che non mi interessa.

    A me servirebbe che il valore sia memorizzato direttamente in una variabile

    Grazie ancora
  • Re: Putchar in una stringa per confronto

    Ovvio che ti stampa a video il contenuto, è quello che fa quella funzione:
    int putchar(char ch) - scrive un char sullo stdout.

    In payloadptr hai già la stringa che vuoi confrontare, non capisco il senso della domanda
  • Re: Putchar in una stringa per confronto

    brugne92 ha scritto:


    Ovvio che ti stampa a video il contenuto, è quello che fa quella funzione:
    int putchar(char ch) - scrive un char sullo stdout.

    In payloadptr hai già la stringa che vuoi confrontare, non capisco il senso della domanda
    ciao
    il problema che prendendo direttamente la variabile in quel modo, non capisco perchè a volte mi mette caratteri sporchi ed ho questo autput (campo message). Premetto che ho inviato "tap1 down"
    
    Message arrived                                                                                                                                                                                                       
         topic: mqttOK                                                                                                                                                                                                    
       message: tap1 down@v9                                                                                                                                                                                              
  • Re: Putchar in una stringa per confronto

    Ciao, partendo dal presupposto che putchar() prende un carattere esistente e lo stampa a video, quel carattere li ce l'hai già! non serve riprenderlo da putchar() e salvarlo in un array, è già scritto da qualche parte in memoria dentro a payloadptr.
    Come invii quel messaggio?
  • Re: Putchar in una stringa per confronto

    brugne92 ha scritto:


    Ciao, partendo dal presupposto che putchar() prende un carattere esistente e lo stampa a video, quel carattere li ce l'hai già! non serve riprenderlo da putchar() e salvarlo in un array, è già scritto da qualche parte in memoria dentro a payloadptr.
    Come invii quel messaggio?
    Ti allego l'intero codice. Non è altro che un subscribe MQTT che è in ascolto su una porta, e riceve dei messaggi che sto cercando di intercettare (lo farò con cicli IF e invocherò altre funzioni ad hoc)
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "MQTTClient.h"
    #define ADDRESS     "tcp://localhost:1883"
    #define CLIENTID    "ExampleClientSub"
    #define TOPIC       "MQTT Examples"
    #define PAYLOAD     "Hello World!"
    #define QOS         1
    #define TIMEOUT     10000L
    volatile MQTTClient_deliveryToken deliveredtoken;
    void delivered(void *context, MQTTClient_deliveryToken dt)
    {
        printf("Message with token value %d delivery confirmed\n", dt);
        deliveredtoken = dt;
    }
    int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
    {
        int i;
        char* payloadptr;
        printf("Message arrived\n");
        printf("     topic: %s\n", topicName);
        printf("   message: ");
        payloadptr = message->payload;
        for(i=0; i<message->payloadlen; i++)
        {
            putchar(*payloadptr++);
        }
        putchar('\n');
        
        //qui metterò i cicli IF recuperando il valore del msg che leggo
        
        MQTTClient_freeMessage(&message);
        MQTTClient_free(topicName);
        return 1;
    }
    void connlost(void *context, char *cause)
    {
        printf("\nConnection lost\n");
        printf("     cause: %s\n", cause);
    }
    int main(int argc, char* argv[])
    {
        MQTTClient client;
        MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
        int rc;
        int ch;
        MQTTClient_create(&client, ADDRESS, CLIENTID,
            MQTTCLIENT_PERSISTENCE_NONE, NULL);
        conn_opts.keepAliveInterval = 20;
        conn_opts.cleansession = 1;
        MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);
        if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
        {
            printf("Failed to connect, return code %d\n", rc);
            exit(EXIT_FAILURE);
        }
        printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
               "Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);
        MQTTClient_subscribe(client, TOPIC, QOS);
        do
        {
            ch = getchar();
        } while(ch!='Q' && ch != 'q');
        MQTTClient_disconnect(client, 10000);
        MQTTClient_destroy(&client);
        return rc;
    }
    
  • Re: Putchar in una stringa per confronto

    Prova così:
    
    payloadptr = (char*)message->payload;
    char copy[200];
          for(i=0; i<message->payloadlen; i++) {
            copy[i++]=  (char)putchar(*payloadptr++);
          }
    
    
    Dimmi se ti va che lo abbelliamo con un puntatore invece di un array fisso
  • Re: Putchar in una stringa per confronto

    brugne92 ha scritto:


    Prova così:
    
    payloadptr = (char*)message->payload;
    char copy[200];
          for(i=0; i<message->payloadlen; i++) {
            copy[i++]=  (char)putchar(*payloadptr++);
          }
    
    
    Dimmi se ti va che lo abbelliamo con un puntatore invece di un array fisso
    Grazie mille per l'aiuto!!!
    Purtroppo mi continuano ad arrivare caratteri sporchi...come scritto prima.

    Ma il problema è della putchar? non essendo tanto ferrato con il C (ho già fatto tutto in phyton che è meno ostico, ma dovendo creare un servizio che è sempre in ascolto, preferisco in C), è possibile non usare la putchar ma qualcosa di diverso?

    Grazie ancora
  • Re: Putchar in una stringa per confronto

    No No il codice è corretto, ma ti arrivano sporchi solo in coda? cioè la parte iniziale è sempre corretta?
  • Re: Putchar in una stringa per confronto

    brugne92 ha scritto:


    No No il codice è corretto, ma ti arrivano sporchi solo in coda? cioè la parte iniziale è sempre corretta?
    si, se ci sono caratteri sporchi è sempre verso la fine
  • Re: Putchar in una stringa per confronto

    rdie77 ha scritto:


    brugne92 ha scritto:


    No No il codice è corretto, ma ti arrivano sporchi solo in coda? cioè la parte iniziale è sempre corretta?
    si, se ci sono caratteri sporchi è sempre verso la fine
    esempio:
    se mando questo msg
    root@raspy:~# mosquitto_pub -d -t mqttOK  -m "tap1 up"
    ricevo correttamente il messaggio
    Message arrived                                                                                                                                                                                                       
         topic: mqttOK                                                                                                                                                                                                    
       message: tap1 up                                                                                                                                                                                                   
    se invece mando questo messaggio
    mosquitto_pub -d -t mqttOK  -m "tap1 upe"
    il messaggio che arriva è questo
    Message arrived                                                                                                                                                                                                       
         topic: mqttOK                                                                                                                                                                                                    
       message: tap1 upe`@v9                                                                                                                                                                                              
  • Re: Putchar in una stringa per confronto

    Alla fine sono riuscito a trovare altro esempio che recepisce correttamente i messaggi
                                                                                 
                                                                                                                                        
    #include <errno.h>                                                                                                                       
    #include <fcntl.h>                                                                                                                       
    #include <stdio.h>                                                                                                                       
    #include <stdlib.h>                                                                                                                      
    #include <string.h>                                                                                                                      
    #include <mosquitto.h>                                                                                                                   
                                                                                                                                             
    // Server connection parameters                                                                                                          
    #define MQTT_HOSTNAME "localhost"                                                                                                        
    #define MQTT_PORT 1883                                                                                                                   
    #define MQTT_USERNAME "admin"                                                                                                            
    #define MQTT_PASSWORD "admin"                                                                                                            
    #define MQTT_TOPIC "test"                                                                                                                
                                                                                                                                             
                                                                                                                                             
    /* gcc -o test-sub test-sub.c -lmosquitto -lssl -lcrypto -pthread */                                                                     
                                                                                                                                             
    /*                                                                                                                                       
     * my_message_callback.                                                                                                                  
     * Called whenever a new message arrives                                                                                                 
     */                                                                                                                                      
    void my_message_callback(struct mosquitto *mosq, void *obj,const struct mosquitto_message *message)                                      
      {                                                                                                                                      
      // Note: nothing in the Mosquitto docs or examples suggests that we                                                                    
      //  must free this message structure after processing it.                                                                              
                                                                                                                                             
      char* msgSent;                                                                                                                         
      msgSent=(char *)message->payload;                                                                                                      
      printf ("Got message: %s\n", (char *)message->payload);                                                                                
      char* strMsg;                                                                                                                          
      strMsg=(char *)msgSent;                                                                                                                
      //printf ("msgSent valore: %s\n", msgSent);
                                                                                                                                             
      //sprintf(strMsg,msgSent);                                                                                                             
      // printf ("strMsg valore: %s\n", strMsg);                                                                                             
                                                                                                                                             
      if ((char *)message->payload=="a")                                                                                                     
      {                                                                                                                                      
            printf ("msgSent tap1 up");                                                                                                      
                                                                                                                                             
      } else if (msgSent=="tap1 down") {                                                                                                     
            printf ("msgSent tap1 down");                                                                                                    
      }                                                                                                                                      
                                                                                                                                        
      }                                                                                                                                      
                                                                                                                                             
    /*                                                                                                                                       
     * Start here                                                                                                                            
     */                                                                                                                                      
    int main (int argc, char **argv)                                                                                                         
      {                                                                                                                                      
      struct mosquitto *mosq = NULL;                                                                                                         
    
    
      // Initialize the Mosquitto library                                                                                                    
      mosquitto_lib_init();                                                                                                                  
                                                                                                                                             
      // Create a new Mosquito runtime instance with a random client ID,                                                                     
      //  and no application-specific callback data.                                                                                         
      mosq = mosquitto_new (NULL, true, NULL);                                                                                               
      if (!mosq)                                                                                                                             
        {                                                                                                                                    
        fprintf (stderr, "Can't init Mosquitto library\n");                                                                                  
        exit (-1);                                                                                                                           
        }                                                                                                                                    
                                                                                                                                             
      // Set up username and password                                                                                                        
    //  mosquitto_username_pw_set (mosq, MQTT_USERNAME, MQTT_PASSWORD);
                                                                                                                                             
      // Establish a connection to the MQTT server. Do not use a keep-alive ping                                                             
      int ret = mosquitto_connect (mosq, MQTT_HOSTNAME, MQTT_PORT, 0);                                                                       
      if (ret)                                                                                                                               
        {                                                                                                                                    
        fprintf (stderr, "Can't connect to Mosquitto server\n");                                                                             
        exit (-1);                                                                                                                           
        }                                                                                                                                    
                                                                                                                                             
      // Subscribe to the specified topic. Multiple topics can be                                                                            
      //  subscribed, but only one is used in this simple example.                                                                           
      //  Note that we don't specify what to do with the received                                                                            
      //  messages at this point                                                                                                             
      ret = mosquitto_subscribe(mosq, NULL, MQTT_TOPIC, 0);                                                                                  
      if (ret)                                                                                                                               
        {                                                                                                                                    
        fprintf (stderr, "Can't publish to Mosquitto server\n");                                                                             
        exit (-1);                                                                                                                           
        }                                                                                                                                    
    
    
      // Specify the function to call when a new message is received                                                                         
      mosquitto_message_callback_set (mosq, my_message_callback);                                                                            
                                                                                                                                             
      // Wait for new messages                                                                                                               
      mosquitto_loop_forever (mosq, -1, 1);                                                                                                  
                                                                                                                                             
      // Tody up. In this simple example, this point is never reached. We can                                                                
      //  force the mosquitto_loop_forever call to exit by disconnecting                                                                     
      //  the session in the message-handling callback if required.                                                                          
      mosquitto_destroy (mosq);                                                                                                              
      mosquitto_lib_cleanup();                                                                                                               
    
    
      return 0;                                                                                                                              
      }                                                                                                                                      
    
    L'unico problema che quando metto la variabile in una stringa, con l'IF non riesco a verificare il msg che viene inviato.
Devi accedere o registrarti per scrivere nel forum
12 risposte