Position d'un caractère dans une chaîne

Bonjour à toutes et à tous,

Dans un String, je recherche la position d'un caractère. Ben j'y arrive pas (honte à moi). Voilà mon sketch :

String data;
void setup() {
  Serial.begin(9600);
}

void loop() {
  data = "Pierre";
  Serial.println(data);
  char * p = strchr(data.c_str(), "r");
  Serial.println(*p);
 delay(1000);
}

" Serial.println(*p);" me sort un tiret !

Ce doit être on ne peut plus simple et bien je patauge.

Merci de votre aide.

Pierre.

Essayez char * p = strchr(data.c_str(), 'r');
Pour un caractère c’est une simple apostrophe pas un guillemet qui est réservé aux cString

Si vous utilisez une String (pas toujours une bonne idée), allez jusqu’au bout et utilisez les fonctions de cette classe comme indexOf

Pour ce genre de test mettez tout dans le setup, ça ne sert pas à grand chose d’avoir la sortie répétée toutes les secondes

[quote="J-M-L, post:2, topic:1159572"]
Essayez char * p = strchr(data.c_str(), 'r');
Pour un caractère c’est une simple apostrophe pas un guillemet qui est réservé aux cString ...[/quote]

L’inverse du langage Pascal ; je me plante toujours.
Mais guère mieux, ça me retourne le caractère lui-même !

Ah, je savais qu'il y avait une fonction bien mieux appropriée, mais je n'arrivais à mettre la main dessus.
J'utilise les "String", car les valeurs viennent d'un Serial.ReadString();

J'avais mis ça dans le setup(), mais comme je ne voyais rien, je l'ai mis dans la loop() en me disant que si j'avais raté l'affichage "une fois", j'avais plus de chance de ne pas le rater en répétition.

Merci pour l'aide.

Cordialement.

Pierre.

Non ça retourne un pointeur vers le caractère recherché… c’est exactement ce que fait la fonction strchr()

Si vous voulez sa position vous faites la différence entre le pointeur obtenu (si non nul) et le pointeur de départ.

J’ai un petit tuto sur la mémoire et les pointeurs si ce n’est pas clair pour vous : Introduction à la mémoire et aux pointeurs sur Arduino

Merci pour le tuto :slight_smile: .

J'ai modifié mon sketch :

String data;
void setup() {
  Serial.begin(9600);
  data = "Pierre";
  Serial.println(data);
  char * p = strchr(data.c_str(), 'r');
  Serial.println(p); // Imprime rre ???
  Serial.println(*p); // Imprime r
  Serial.println(int(&*p)); // Imprime je suppose l'adresse : 471
  
  int x  = strchr(data.c_str(), 'r');
  Serial.println(x); // Imprime je suppose l'adresse : 471
  Serial.println(char(&x)); // Imprime un point d'interrogation dans un carré.
}

void loop() {}

Dans un premier cas, j'écris : char * p = strchr(data.c_str(), 'r');

  • j'obtiens rre avec Serial.println(p); --> ???
  • pour obtenir l'adresse de ce caractère, je suis obligé d'en passer par : Serial.println(int(&*p));

Dans le deuxième cas, j'écris : int x = strchr(data.c_str(), 'r');

  • un Serial.println(x); me donne l'adresse du caractère
  • malgré divers essais, je n'arrive pas à imprimer le caractère lui-même, au mieux, j'ai un point d'interrogation dans un carré.

Comment retrouver le caractère dans ce cas ?

Cordialement.

Pierre.

p est un pointeur sur un char
Serial.print lorsqu'on lui passe en argument un char* essaie d'afficher une c-string donc il affiche le caractère pointé par le pointeur et les suivants jusqu'à trouver un terminateur de chaine \0


Pour la seconde partie du programme, si tu actives

image
tu auras des messages qui t'indiqueront que tu fais des choses pas très claires

/tmp/.arduinoIDE-unsaved2023719-5114-18zwk8u.5a72/sketch_aug19a/sketch_aug19a.ino: In function 'void setup()':
/tmp/.arduinoIDE-unsaved2023719-5114-18zwk8u.5a72/sketch_aug19a/sketch_aug19a.ino:11:18: warning: invalid conversion from 'char*' to 'int' [-fpermissive]
   int x  = strchr(data.c_str(), 'r');
            ~~~~~~^~~~~~~~~~~~~~~~~~~
/tmp/.arduinoIDE-unsaved2023719-5114-18zwk8u.5a72/sketch_aug19a/sketch_aug19a.ino:13:25: warning: cast from 'int*' to 'char' loses precision [-fpermissive]
   Serial.println(char(&x)); // Imprime un point d'interrogation dans un carré.

essayez cela

String data = "Pierre.";
void setup() {
  Serial.begin(115200);
  Serial.println(data);
  char * p = strchr(data.c_str(), 'r');
  if (p != nullptr) {

    // la position à partir de l'indice 0 (premier caractère)
    Serial.print("Le premier 'r' est à l'indice N° ");
    Serial.println(p - data.c_str());

    // le caractère précédent en utilisant le pointeur
    if (p - data.c_str() > 0) {
      Serial.print("Le caractère précédent est '");
      Serial.print(*(p - sizeof(char)));
      Serial.println("'");
    } else Serial.println("pas de caractère précédent");

    // le caractère suivant en utilisant le pointeur
    if (p - data.c_str() < strlen(data.c_str())-1) {
      Serial.print("Le caractère suivant est '");
      Serial.print(*(p + sizeof(char)));
      Serial.println("'");
    } else Serial.println("pas de caractère suivant");
  } else {
    Serial.println("il n'y a pas de 'r'");
  }
}

void loop() {}

@ fdufnews : c'est vrai que c'est toujours intéressant d'afficher les avertissements, par exemple : [-fpermissive]

@ J-M-L : merci pour cet exemple sur l'utilisation des pointeurs.

Cordialement.

Pierre.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.