Skip to content

Instantly share code, notes, and snippets.

@ypelletier
Last active October 3, 2022 08:32
Show Gist options
  • Save ypelletier/0d12749b46637620c18a7b6e687b65cd to your computer and use it in GitHub Desktop.
Save ypelletier/0d12749b46637620c18a7b6e687b65cd to your computer and use it in GitHub Desktop.
Démonstration des tableaux de caractères en C.
/*
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