String dans char

Bonjour,

après avoir passé quelques heures à chercher une solution à mon problème, je me décide à la poste pour demander de l’aide.

Déjà, il faut savoir que je débute avec Arduino, et je viens de php, dont les variables sont beaucoup plus souple.

Je désire mettre payload dans char str afin de traiter cette variable. j’ai toujours :

exit status 1
initializer fails to determine size of ‘str’

voilà mon code :

                String payload = http.getString();
                USE_SERIAL.println(payload);

                char str[] = payload ;
                char dlm[] = "|";
                 
                int cnt = 0;
                char* tab[10] = { 0 };
                 
                char *pch = strtok(str, dlm);
                 
                while ( pch != NULL ) {
                    if (cnt < 10) {
                        tab[cnt++] = pch;
                    } else {
                        break;
                    }
                    pch = strtok (NULL, dlm);
                }

Comment pratiquer afin de le faire correctement ?

Merci,

Christophe

Pour utiliser une "String" en tant que chaine C, (pour le serial.println() ) il te faut utiliser la fonction c_str() :

String payload = http.getString();
USE_SERIAL.println(payload.c_str());

La variable str[] n'est pas dimentionnée

char str[] = payload ;

char str[20]; strcnpy(str, payload, 19);

Bonjour et merci pour votre aide,

Vous entendez quoi par dimensionné, je comprend le [20], mais la commande :

strcnpy(str, payload, 19);

Je ne la comprend pas. J’ai essayé de mettre 20, mais le message est le suivant :

exit status 1
array must be initialized with a brace-enclosed initializer

:o

Merci,

j’ai arbitrairement dimensionné la variable str à 20 octets
char str[20];
(en C les chaines de caractères sont terminées par 0x00, ce qui donne 19 caractères disponibles + 1 caractère pour 0x00);

ne connaissant pas le nombre caractères présents dans ‘payload’, et pour être sur de ne pas copier plus de 19 caractères dans la variable str, mon exemple utilise la fonction strncpy qui copie au maximum les 19 premiers catactères
strncpy(str, payload, 19);

dans le cas où tu as besoin d’un plus grand nombre de caractères du peu bien évidemment alouer plus d’espace à la variable str

de plus je viens de vérifier le comportement de la fonction strncpy, elle ne copie pas le caractère de fin de chaine 0x00 dans le cas ou le nombre max de caratères est copié. il faut donc ajouter manuellement de caractère

par exemple
char str[64];
strncpy(str, payload, 63);
str[63]=0x00;

ou de façon plus élégante
char str[64];
strncpy(str, payload, sizeof(str)-1);
str[sizeof(str)-1]=0x00;

il manque un détail d’importance à mon exemple
il faut ajouter
#include <string.h>
en début du code source

en ce qui concerne ton message d’erreur voir ici

Désolé, mais je retourne le truc dans tout les sens et impossible, je dois louper un petit truc.

Peux-tu, selon le code ci-dessous modifier en conséquence, car j’ai toujours des messages d’erreurs ?

    String payload = http.getString();
                USE_SERIAL.println(payload);


                char str[20] = payload;
                char dlm[] = "|";
                 
                int cnt = 0;
                char* tab[10] = { 0 };
                 
                char *pch = strtok(str, dlm);
                 
                while ( pch != NULL ) {
                    if (cnt < 10) {
                        tab[cnt++] = pch;
                    } else {
                        break;
                    }
                    pch = strtok (NULL, dlm);
                }

Merci,

Christophe

Bonjour,

Pourquoi tu ne fais pas ce qu’on t’as conseillé plus haut? Ca aurai donné

 String payload = http.getString();
 USE_SERIAL.println(payload.c_str());

 char str[64];
 char dlm[] = "|";

 strncpy(str,payload.c_str(),sizeof str-1);
 str[sizeof str-1]=0;

 int cnt = 0;
 char* tab[10] = { 0 };

 char *pch = strtok(str, dlm);

 while ( pch != NULL ) {
   if (cnt < 10) {
     tab[cnt++] = pch;
   } else {
     break;
   }
   pch = strtok (NULL, dlm);
 }

char str[20] = payload;

tu ne peu pas déclarer une variable et lui affecter une valeur provenant d'une autre variable en même temps

le contenu de la variable payload est inconnu au moment de la compilation le compilateur ne comprend pas ce qui tu lui dit :confused:

Un grand merci cela fonctionne, mais il me semblait avoir testé comme CA... ::)

Merci de votre aide !!!

CHristophe

Alain46: tu ne peu pas déclarer une variable et lui affecter une valeur provenant d'une autre variable en même temps

Si on peut. Par exemple:

  int a=10;
  int b=a;

Le problème ici c'est que les variables ne sont pas compatibles.

int a=10; int b=a;

effectivement il n'y a pas d'erreur de compilation puisque le valeur de a est connue