String C++. concat•c_srt•indexOf•replace•subString… pour Arduino ESP32 ESP8266 • Domotique et objets connectés à faire soi-même

La librairie C++ pour Arduino propose 24 fonctions pour manipuler très facilement les chaînes de caractères. charAt • compareTo • concat • c_str • endsWith • equals • getBytes • indexOf • length • remove •  replace • startsWith • setCharAt • subString • reserve • toCharArray • toLowerCase • toUpperCase • trim… Ces fonctions sont supportées par le framework ESP32-Arduino (le wrapper du SDK ESP-IDF) pour les cartes de développement ESP32 ainsi que le SDK pour les cartes ESP8266.

Remarques générales

  • L’index du premier caractère d’une chaîne se trouve à la position 0, et non pas 1.
  • On peut être amené à manipuler les chaînes avec des tableaux de bytes. 1 caractère = 1 byte

Accès rapide aux fonctions

charAt  compareTo   concat  c_str    endsWith   equals    getBytes    indexOf    length    remove     replace    startsWith    setCharAt    subString   reserve    toCharArray    toLowerCase    toUpperCase    trim    opérateurs

Fonctions C++ pour manipuler les chaînes avec du code Arduino

Tous les fonctions permettant de manipuler les String sont détaillées ici sur le site officiel de la fondation.

charAt(n) permet d’extraire le caractère d’une chaîne à la position n

Serial.println(string1.charAt(2));

compareTo() Compare deux chaînes. Valeur retournée

  • un nombre négatif si myString précède myString2.
  • 0 si les deux chaines sont identiques
  • un nombre positif si myString est situé après myString2
Serial.println(string1.compareTo(string2));

concat() Concatène (assemble) deux chaînes. Le résultat est copié dans la première String

startstring.concat(endstring);
Serial.print(startstring);

Il est aussi possible de concatener des chaînes à l’aide de l’opérateur += comme ceci

String demo = "une";
demo += " chaine ";
demo += "de caractères";

c_str() Convertit le contenu d’une chaîne en une chaîne de type C terminée par un caractère nul ‘\0’.

endsWith() Test si une chaîne se termine ou non par les caractères d’une autre chaîne.
Retourne true si c’est le cas, false dans le cas contraire.

La fonction startsWith() permet de faire la même chose mais depuis le début de la chaîne.

Serial.println(string1.endsWith("manipulation"));

equals() Compare si deux chaînes sont identiques.
Attention, la comparaison est sensible à la casse, c’est à dire qu’il faut faire attention aux majuscules et aux minuscules. La chaîne arduino n’est pas égale à la chaîne ARDUINO.

Pour le pas tenir compte de la casse, utiliser la fonction equalsIgnoreCase()

String string1 = "A string to test Arduino string manipulation";
String string2 = "a string to test Arduino string manipulation";
Serial.println(string1.equals(string2));  // retourne 0, differentes
Serial.println(string1.equalsIgnoreCase(string2)); // retourne 1, identiques

getBytes(buffer, len) Copie chaque caractères de la chaîne dans un buffer (tampon).

La taille len du buffer doit correspondre au nombre de caractères de la chaîne + 1.

String stringtocopy = "ESP8266"; 

// mesure la longueur de la chaine
int buffer_size = stringtocopy.length();
Serial.printf("Buffer size: %u\n", buffer_size);

// Cree un buffer ayant la meme taille que la chaine
byte buffer[buffer_size]; 

// Copie le contenu de la chaine a l'aide de la fonction getBytes
// Attention, il faut ajouter 1 a la taille de la chaine pour ne pas avoir de caractere NULL
stringtocopy.getBytes(buffer, buffer_size + 1); 
Serial.println("Print buffer with write function"); 

// On imprime un a un chaque cellule du buffer a l aide d une boucle for
for (int i = 0; i < buffer_size; i++) { 
  Serial.write(buffer[i]); 
} 

indexOf(val, from) Cherche la val d’un caractère ou d’une chaîne. Par défaut, la recherche démarre au début de la chaîne. Indiquer la position de départ from pour démarrer la recherche depuis une caractère précis.

La fonction indexOf() retourne la position de la première occurence de la chaîne trouvée et -1 dans le cas contraire.

Remarque, la fonction indexOf() peut renvoyer un résultat incohérent lorsqu’on l’utilise directement dans une autre fonction. Il faut passer par une variable intermédiaire pour récupérer l’index comme dans l’exemple ci-dessous

int posString = string1.indexOf("Arduino");
Serial.println("Position of Arduino string " + String(posString));

length() Renvoie la longueur de la chaîne, en caractères sans le caractère de fin de chaîne ‘\0’.

Serial.println(string1.length());

remove(from, n) Supprime les n caractères de la chaîne depuis l’index from. Le résultat est stocké dans la chaîne initiale.

String demoremove = "hello";
demoremove.remove(2,2);
Serial.println(demoremove);  // devient "heo"

replace() La fonction permet de remplacer toutes les occurrences d’un caractère / chaîne donné par un autre caractère / chaîne.

string1.replace("Arduino","ESP32");
Serial.println(string1); 

Pour remplacer uniquement un caractère, on peut aussi utiliser la fonction setCharAt().

startsWith() Test si la chaîne commence par le chaîne passée en paramètre.

Serial.println(string1.startsWith("A text"));

setCharAt( pos, char) Remplace un caractère de la chaîne à la position par un nouveau character.

String stringtomodify = "hello";
char myChar = 'L';  
stringtomodify.setCharAt(2,myChar);
Serial.println(stringtomodify);   // renvoie heLlo

substring(from, to) Extrait une portion de la chaîne depuis l’index from jusqu’au caractère to.
Utiliser la fonction indexOf() pour connaître la position (l’index) d’un caractère ou d’un mot dans la chaîne.

int posString = string1.indexOf("Arduino");
Serial.println("Position of Arduino string " + String(posString));  
// Extrait le mot Arduino dans la chaine
Serial.println(string1.substring(posString, posString + 7));

reserve() permet d’optimiser la mémoire en allouant la taille de la mémoire réservée à une variable de type String.

String myString;
myString.reserve(20);
myString = "a ";
myString += "demo ";
myString += "with a string";
Serial.println(myString);

Forcer en majuscule ou minuscule, supprimer les espaces vides

toLowerCase() force tous les caractères de la chaîne en minuscule

toUpperCase() force tous les caractères de la chaîne en majuscule

trim() supprime tous les espaces au début et à la fin de la chaîne

Fonctions de conversion de chaînes de type String

toCharArray(buffer, len) copie chaque caractère d’une chaîne dans un buffer de taille len.

String stringtocopy = "ESP8266"; 

// mesure la longueur de la chaine
int buffer_size = stringtocopy.length();
Serial.printf("Buffer size: %u\n", buffer_size);

// Cree un buffer ayant la meme taille que la chaine
byte buffer[buffer_size]; 

// Copie le contenu de la chaine a l'aide de la fonction getBytes
// Attention, il faut ajouter 1 a la taille de la chaine pour ne pas avoir de caractere NULL
stringtocopy.getBytes(buffer, buffer_size + 1); 
Serial.println("Print buffer with write function"); 

// On imprime un a un chaque cellule du buffer a l aide d une boucle for
for (int i = 0; i < buffer_size; i++) { 
  Serial.write(buffer[i]); 
} 

Conversion d’un nombre stocké dans une String

Fonction Usage Exemple
toDouble()

toFloat()

Conversion vers une variable de type double ou float

Par exemple, les chaînes “123.45”, “123” et “123fish” sont converties en 123,45, 123,00 et 123,00 respectivement. La fonction réalise un arrondi, par exemple “123,456” sera arrondi à 123,46. Les flottants n’ont que 6 à 7 chiffres décimaux de précision, par conséquent les chaînes plus longues peuvent être tronquées.

myString.toDouble()
toInt() Conversion d’une chaine en entier
myString.toInt()

Opérateurs autorisés sur les chaînes

Opérateur Utilisation Exemple
[] Accéder à un élément d’un buffer
Serial.write(buffer[i]);
Initialiser un buffer
byte buffer[7];
+ Concatène (assemble) deux chaînes
Serial.println("Position of Arduino string " + String(posString));
+= Ajoute à une chaine existante une nouvelle chaîne
String demo = "une"; 
demo += " chaine ";
== Comparaison Vrai si les chaînes sont identiques
> Strictement plus grand Utilise les comparateurs mathématiques pour comparer deux chaînes

String first = "abc1234";
String second = "def1234";
Serial.print(" first == second "); Serial.println(first == second);  // 0
Serial.print(" first > second "); Serial.println(first > second);    // 0
Serial.print(" first >= second "); Serial.println(first >= second);  // 0
Serial.print(" first < second "); Serial.println(first > second);    // 0
Serial.print(" first = =====");
  String first = "abc1234";
  String second = "def1234";
  Serial.print(" first == second "); Serial.println(first == second);  // 0
  Serial.print(" first > second "); Serial.println(first > second);    // 0
  Serial.print(" first >= second "); Serial.println(first >= second);  // 0
  Serial.print(" first < second "); Serial.println(first > second);    // 0
  Serial.print(" first