Last active
October 3, 2022 08:32
-
-
Save ypelletier/0d12749b46637620c18a7b6e687b65cd to your computer and use it in GitHub Desktop.
Démonstration des tableaux de caractères en C.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Démonstration des tableaux de caractères en C. | |
http://electroniqueamateur.blogspot.com/2019/10/texte-et-arduino-2-les-tableaux-de.html | |
*/ | |
const byte longueurMax = 32; // nombre maximal de caractères | |
char texteRecu[longueurMax]; | |
char reponse[longueurMax * 2]; | |
char valeur[10]; | |
char * resultat; //// pour quand la fonction retourne un pointeur vers un caractère de la chaîne | |
boolean nouvellesDonnees = false; | |
void setup() { | |
Serial.begin(9600); | |
Serial.println ( F("Veuillez écrire votre message.") ) ; | |
} | |
void loop() { | |
receptionMessage(); | |
if (nouvellesDonnees == true) { | |
// Utilisation de strcpy | |
strcpy(reponse, "Voici votre message: "); | |
// utilisation de strcat pour combiner deux chaînes | |
strcat(reponse, texteRecu); | |
Serial.println(reponse); | |
// utilisation de strncat pour combiner deux chaînes en limitant le nombre de caractères | |
strcpy(reponse, "5 premières lettres de votre message: "); | |
strncat(reponse, texteRecu, 5); | |
Serial.println(reponse); | |
// utilisation de strncpy pour copier les premiers caractères d'une chaîne | |
Serial.print(F("3 premières lettres de votre message: ")); | |
strncpy(reponse, texteRecu, 3); | |
reponse[3] = '\0'; // ajout manuel du caractère NULL | |
Serial.println(reponse); | |
//Utilisation de strlen et de sprintf | |
strcpy(reponse, "Votre message comporte "); | |
sprintf(valeur, "%d", strlen(texteRecu) - 1); | |
strcat(reponse, valeur); | |
strcat(reponse, " caractères."); | |
Serial.println(reponse); | |
// trouver un caractère, modifier un caractère | |
strcpy(reponse, "Le 4e caractère de votre message est *"); | |
reponse[strlen(reponse) - 1] = texteRecu[3]; | |
Serial.println(reponse); | |
// Comparaison de 2 chaînes (strcmp) | |
if (!strcmp(texteRecu, "Arduino")) | |
{ | |
Serial.println(F("Votre message est Arduino")); | |
} | |
else | |
{ | |
Serial.println(F("Votre message n'est pas Arduino")); | |
} | |
// comparaison du début de deux chaînes: strncmp | |
if (!strncmp(texteRecu, "Bonjour", 7)) | |
{ | |
Serial.println(F("Votre message commence par Bonjour")); | |
} | |
else | |
{ | |
Serial.println(F("Votre message ne commence pas par Bonjour")); | |
} | |
// recherche d'un caractère dans une chaîne: strchr() | |
resultat = strchr(texteRecu, 'a'); | |
if (resultat != NULL) { | |
Serial.print (F("Votre message, à partir de la première lettre a: ")); | |
Serial.println(resultat); | |
Serial.print(F("Position de la première occurrence de la lettre a: ")); | |
Serial.println(resultat - texteRecu); | |
} | |
else { | |
Serial.println(F("La lettre a ne figure pas dans votre message")); | |
} | |
// recherche d'un caractère dans une chaîne, en commençant par la fin: strrchr() | |
resultat = strrchr(texteRecu, 'c'); | |
if (resultat != NULL) { | |
Serial.print (F("Votre message, à partir de la dernière lettre c: ")); | |
Serial.println(resultat); | |
Serial.print(F("Position de la dernière occurrence de la lettre c: ")); | |
Serial.println(resultat - texteRecu); | |
} | |
else { | |
Serial.println(F("La lettre c ne figure pas dans votre message")); | |
} | |
resultat = memchr (texteRecu, 'p', 5); | |
if (resultat != NULL) { | |
Serial.print(F("Votre message, à partir de la première lettre p, si elle se trouve parmi les 5 premières lettres: ")); | |
Serial.println(resultat); | |
Serial.print(F("Position de la première lettre p, si elle se trouve parmi les 5 premières lettres: ")); | |
Serial.println(resultat - texteRecu); | |
} | |
else { | |
Serial.println(F("La lettre p ne figure pas parmi les 5 premières lettres")); | |
} | |
// recherche de plusieurs caractères dans une chaîne: strpbrk() | |
resultat = strpbrk(texteRecu, "aeiouyAEIOUY"); | |
if (resultat != NULL) { | |
Serial.print (F("Votre message, à partir de la première voyelle: ")); | |
Serial.println(resultat); | |
Serial.print(F("Position de la première voyelle de votre message: ")); | |
Serial.println(resultat - texteRecu); | |
} | |
else { | |
Serial.println(F("Votre message ne comporte aucune voyelle.")); | |
} | |
//Recherche d'une chaîne dans une autre: strstr() | |
resultat = strstr(texteRecu, "ami"); | |
if (resultat != NULL) { | |
Serial.print (F("Votre message, à partir du mot ami: ")); | |
Serial.println(resultat); | |
Serial.print(F("Position de la première occurrence du mot ami: ")); | |
Serial.println(resultat - texteRecu); | |
} | |
else { | |
Serial.println(F("Votre message ne comporte pas le mot ami.")); | |
} | |
// position strspn | |
Serial.print(F("Nombre de voyelles consécutives au début du message: ")); | |
Serial.println(strspn(texteRecu, "aeiouyAEIOUY")); | |
// position de la première occurrence d'une lettre parmi un groupe strcspn() | |
Serial.print(F("La première voyelle de votre message apparaît à la position: ")); | |
Serial.println(strcspn(texteRecu, "aeiouyAEIOUY")); | |
// remplacement des 3 premiers caractères par un même caractère: memset() | |
strcpy(reponse, "1234567"); | |
memset(reponse, '*', 3); | |
Serial.print(F("Utilisation de memset(): ")); | |
Serial.println(reponse); | |
// Inverser l'ordre des lettres: strrev() | |
Serial.print(F("Votre message, à l'envers: ")); | |
Serial.println (strrev(texteRecu)); | |
// conversion d'un nombre en texte | |
int unEntier = 24; | |
sprintf(reponse, "Valeur mesuree: %d °C", unEntier); | |
Serial.println(reponse); | |
strcpy(reponse, "Compteur: "); | |
itoa(unEntier, valeur, 10); | |
strcat(reponse, valeur); | |
Serial.println(reponse); | |
float valeurDecimale = 8.0 / 7.0; | |
strcpy(reponse, "Resultat du calcul: "); | |
dtostrf(valeurDecimale, 8, 4, valeur); | |
strcat(reponse, valeur); | |
Serial.println(reponse); | |
// conversion d'un texte en nombre | |
strcpy(valeur, "100"); | |
unEntier = atoi(valeur) + 67; | |
Serial.println(unEntier); | |
strcpy(valeur,"1.234"); | |
valeurDecimale = atof(valeur) + 2.0; | |
Serial.println(valeurDecimale); | |
nouvellesDonnees = false; | |
Serial.println ( " " ) ; | |
Serial.println ( F("Veuillez écrire votre message" )) ; | |
} | |
} | |
/* | |
Fonction permettant de lire un string à partir du moniteur série. | |
Source: https://forum.arduino.cc/index.php?topic=396450.0 | |
Fonctionne à la condition que le moniteur série soit réglé à "Nouvelle ligne". | |
*/ | |
void receptionMessage() { | |
static byte index = 0; | |
char charRecu; | |
while (Serial.available() > 0 && nouvellesDonnees == false) { | |
charRecu = Serial.read(); | |
if (charRecu != '\n') { // ce n'est pas la fin du message | |
texteRecu[index] = charRecu; | |
index++; | |
if (index >= longueurMax) { | |
index = longueurMax - 1; | |
} | |
} | |
else { // c'est la fin du message | |
texteRecu[index] = '\0'; // on termine le texte par le caractère nul | |
index = 0; | |
nouvellesDonnees = true; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment