Lorsqu’on commence la programmation avec Arduino, on arrive très vite à l’utilisation de chaîne de caractères ou String. Une chaîne de caractères permet de stocker du texte. Elle est utilisée, notamment, pour afficher du texte sur un écran LCD ou pour envoyer un texte au moniteur série. C’est même souvent le premier exemple proposé: l’affichage de « Hello World! »,qui et une chaîne de caractères, dans le moniteur série. Nous allons voir dans ce tutoriel les méthodes de définition et utilisations courantes de ce type de variable.
Il y a différentes façons de définir une chaîne de caractères dans Arduino
- tableau (ou array) de caractère de type char
- type String défini dans le langage d’Arduino
Le type String est, en fait, un tableau de caractères terminant par un caractère nul.
Tableau de char
Tout au long de ce tutoriel, nous allons utilisé l’exemple le plus utiliser au monde « Hello World » et le décortiquer en long et en large.
Taille d’une chaîne de caractères
Dans le but d’étudier les chaînes nous allons utiliser deux fonctions très pratiques:
- strlen pour connaitre la longueur d’une chaîne de caractères
- sizeof pour connaitre la taille du tableau contenant la chaîne
char str[]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.print("String length :");Serial.println(strlen(str)); Serial.print("Array length :");Serial.println(sizeof(str)); for(int i=0;i<sizeof(str);i++){ Serial.println(str[i]); } Serial.println(F(" end of string")); } void loop() {}
Grâce à cet exemple simple, nous notons déjà une information intéressante. Le programme Arduino rajoute un caractère null à la fin de la chaîne de caractères.
Hello World!
String length :12
Array length :13
H
e
l
l
o
W
o
r
l
d
!
end of string
Dans cet exemple, notre chaîne de caractères à une longueur de 12. Si nous définissons explicitement la longueur du tableau, nous devons rajouter le caractère nul de fin de chaîne.
char str[13]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.print("String length :");Serial.println(strlen(str)); Serial.print("Array length :");Serial.println(sizeof(str)); for(int i=0;i<sizeof(str);i++){ Serial.println(str[i]); } Serial.println(F("> end of string")); } void loop() {}
Hello World!
String length :12
Array length :13
H
e
l
l
o
W
o
r
l
d
!
> end of string
Modification d’une chaîne de caractères
Le texte d’un tableau de caractères ne peut être changé d’un coup, il faut affecter le nouveau texte caractère par caractère.
char chars[]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(F("Delete end of string")); chars[6]=0; Serial.println(chars); Serial.println(F("Replace word")); chars[6]='Y'; chars[7]='o'; chars[8]='u'; chars[9]=0; Serial.println(chars); Serial.print("String length :");Serial.println(strlen(chars)); Serial.print("Array length :");Serial.println(sizeof(chars)); for(int i=0;i<sizeof(chars);i++){ Serial.println(chars[i]); } Serial.println(F(" end of chars")); } void loop() {}
On remarque la taille du tableau garde la taille initiale alors que la taille de la chaîne est modifiée. Si on parcours le tableau jusqu’au bout, on peut voir que les caractères n’ont pas été effacés ou remplacés. Sachant cela, faites attention en manipulant les chaînes de caractères.
Delete end of string
Hello
Replace word
Hello You
String length :9
Array length :13
H
e
l
l
o
Y
o
u
d
!
end of chars
Concaténation
Une autre manière de remplacer un texte est d’utiliser la fonction strcat(), qui permet d’ajouter une chaîne de caractères à la fin d’une autre.
char chars[]="Hello World!"; void setup() { Serial.begin(9600); Serial.println(F("Delete end of string")); chars[6]=0; Serial.println(chars); Serial.println(F("Concat word")); strcat(chars,"You"); Serial.println(chars); Serial.print("String length :");Serial.println(strlen(chars)); Serial.print("Array length :");Serial.println(sizeof(chars)); for(int i=0;i<sizeof(chars);i++){ Serial.println(chars[i]); } Serial.println(F(" end of chars")); } void loop() {}
Cet exemple est équivalent au code précédent. La fonction strcat va modifier la chaîne chars. Si vous voulez garder la chaîne de caractères d’origine vous pouvez définir un autre string et y copier le texte.
Copier un texte
char chars[]="Hello World!"; char str[20]; void setup() { Serial.begin(9600); strcpy(str,chars); str[6]=0; strcat(str,"You"); Serial.println(str); Serial.print("String length :");Serial.println(strlen(str)); Serial.print("Array length :");Serial.println(sizeof(str)); Serial.println(chars); } void loop() {}
Hello You
String length :9
Array length :20
Hello World!
Lorsque la chaîne de caractères n’est pas définie, on sera obligé de définir une taille de tableau afin que le microprocesseur puisse réserver la mémoire nécessaire.
Comparaison de deux chaînes de caractères
Même si la chaîne de caractères est contenue dans des tableaux de tailles différentes, il est possible de les comparer en utilisant la fonction strcmp().
char chars[]="Hello World!"; char str[20]; void setup() { Serial.begin(9600); strcpy(str,chars); Serial.println(chars); if(strcmp(chars,str)==0){ Serial.println("str and chars are the same"); } } void loop() {}
N.B. le test logique équivalent « == » ne fonctionne que pour les caractères uniques (ex: char c= ‘c’; Serial.println(c==’c’);)
Fonctions à retenir
- sizeof(str) pour connaitre la taille du tableau
- strlen(str) pour connaitre la longueur d’une chaîne dans un tableau
- strcat(str, str1) ajoute str1 à la fin de str
- strcopy(str1, str) copie str dans str1
- strcmp(str,str1) pour comparer deux tableaux de caractères
String Arduino
L’objet String est défini dans le langage Arduino et contient un ensemble de fonctions pratiques pour manipuler des chaînes de caractères.
Taille d’un String
Dans le but d’étudier les chaînes nous allons utiliser deux fonctions très pratiques:
- str.length() pour connaitre la longueur d’une chaîne de caractères
- sizeof pour connaitre la taille de la variable
String str="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.print("String length :");Serial.println(str.length()); Serial.print("Array length :");Serial.println(sizeof(str)); for(int i=0;i<str.length();i++){ Serial.println(str[i]); } Serial.println(F(" end of string")); } void loop() {}
Hello World!
String length :12
Array length :6
H
e
l
l
o
W
o
r
l
d
!
end of string
Modification d’un String
La modification d’un mot avec l’objet String est bien plus simple qu’avec le tableau de char.
String str="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.println(F("Replace word")); str.replace("World!","You"); Serial.println(str); } void loop() {}
Hello World!
Replace word
Hello You
Concaténation
La concaténation d’objet String est aussi simple qu’une addition.
String str="Hello World!"; void setup() { Serial.begin(9600); Serial.println(str); Serial.println(F("Concat word")); str=str+"You"; Serial.println(str); } void loop() {}
Hello World!
Concat word
Hello World!You
Comparaison de deux Strings
Pour copier et comparer des Strings, les opérateurs usuels « = » et « == » peuvent être utilisés
String str="Hello World!"; String str1; void setup() { Serial.begin(9600); str1=str; //copy String if(str==str1){ Serial.println("str and str1 are the same"); } } void loop() {}
Hello World!
str and str1 are the same
Fonctions à retenir
- sizeof(str) pour connaitre la taille du tableau
- length(str) pour connaitre la longueur d’une chaîne de caractères dans un tableau
- replace(str, str1) remplace str par str1
- substring(index1, index2) extrait le String de l’index1 à l’index2
- indexOf(), lastIndexOf() pour trouver un caractère dans le String
Travailler avec des chaînes de caractères et des Strings
Dans certains projets, il vous arrivera certainement de devoir manipuler les deux types de variables. Il est possible de passer de l’un à l’autre en utilisant le constructeur String() pour passer de char à String et en utilisant la fonction toCharArray() pour passer de String à char.
String str="Hello World!",str1; char chars[]="Hello World!",chars1[20]; void setup() { Serial.begin(9600); str1=String(chars); //convert char to String str.toCharArray(chars1, 20); if(str==str1){ Serial.println("str and str1 are the same"); } if(strcmp(chars,chars1)==0){ Serial.println("chars and chars1 are the same"); } } void loop() {}
Bonus: écrire un texte sur plusieurs lignes
Lorsque le texte du String est assez long, vous pouvez soit:
- L’écrire sur une seule ligne en plaçant les caractères fin de ligne (« \n ») et retour charito (\r)
String header="HTTP/1.1 200 OK\n\rContent-Type: text/html\n\r\n\r";
- Concaténer plusieurs chaines de caractère pour obtenir le texte que vous souhaitez
String header="HTTP/1.1 200 OK\n\r"; header+="Content-Type: text/html\n\r"; header+="\n\r";
Une méthode bien plus pratique qui vous permettra de mieux visualiser et modifier le texte existe. La balise R spécifie au compilateur de traiter ce qu’il y a entre les balise comme un texte.
String header=R"=====( HTTP/1.1 200 OK Content-Type: text/html )=====";
Ceci vous permettra de modifier tout le texte à l’aide d’un simple copier-coller.
Sources
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie