Dividere una stringa per carattere ed assegnare ad ogni carattere una funzione

Salve a tutti...
Vi spiego subito il mio problema, ho costruito un robot con due motori passo passo in grado di scrivere per terra su di un foglio o altro, ho scritto il codice con tutte le funzioni necessarie che mi permettono grazie ad dei (Void) di tipo Void A() Void B() etc... di scrivere delle frasi, lettere o disegnare forme...
Fin qui tutto bene, ora il mio problema e che per fare tutto ciò devo andare a modificare ogni volta il codice
ad esempio:

  C();
  I();
  A();
  O();
  moveForward(100);
  done();
  while(1);

Ora vorrei fare in modo di evitare tutto questo creando una funzione di timo void message(), che mi permetta di inserire una frase in una string tipo:

char* message = "CIAO";
C=C();
I=I();
ETC...

sono ormai 3 giorni che sbatto la testa ma non riesco a capire in che modo fare, tutto quello che sono riuscito a fare fino ad ore e scrivere questo codice:

char* message = "CIAO";
void write_message() {
  if (strstr(message, "A")) A();
  if (strstr(message, "B")) B();
  if (strstr(message, "C")) C();
  if (strstr(message, "D")) D();
  if (strstr(message, "E")) E();
  if (strstr(message, "F")) f();
  if (strstr(message, "G")) G();
  if (strstr(message, "H")) H();
  if (strstr(message, "I")) I();
  if (strstr(message, "J")) J();
  if (strstr(message, "K")) K();
  if (strstr(message, "L")) L();
  if (strstr(message, "M")) M();
  if (strstr(message, "N")) N();
  if (strstr(message, "O")) O();
  if (strstr(message, "P")) P();
  if (strstr(message, "Q")) Q();
  if (strstr(message, "R")) R();
  if (strstr(message, "S")) S();
  if (strstr(message, "T")) T();
  if (strstr(message, "U")) U();
  if (strstr(message, "V")) V();
  if (strstr(message, "W")) W();
  if (strstr(message, "X")) X();
  if (strstr(message, "Y")) Y();
  if (strstr(message, "Z")) Z();
}

Questo codice funziona ma ovviamente mi scrive le lettere in ordine degli if e non i base all'ordine della frase, in questo caso scrive: ACIO...
Come posso fare per risolvere?
Grazie in anticipo a chi mi risponderà :slight_smile: .

Ciao! Devi scorrere la stringa per carattere, confronti poi i singoli caratteri e richiami la funzione corrispondente.

Esempio:

// La funzione lavora su stringhe stile C array di char 

// Si usano else if nel confronto perché risulta più veloce, se usi una sequenza di if
// Verranno sempre tutti valutati, mentre un else if, viene valutato solo se i precedenti sono falsi

// Notare che per i caratteri si usano i singoli appici e non le virgolette,  'A' e non "A"

void messaggio(char *s){

     int i=0;
     for(i=0;s[i]!='\0';i++){// Scorro la stringa carattere per carattere fino al carattere terminatore '\0'
     
           if(s[i]=='A') 
               A();
           else if(s[i]=='B')
                B();
           else if(.....)......
     }
}

Semplicemente prendendo la lunghezza della tua stringa per saper di quanti caratteri è composta e poi, dato che la variabile *message" altro non è che un char array, con un FOR avanzare di carattere e carattere e con uno SWITCH richiamare la dovuta funzione ...

  1. scopri la lunghezza della stringa
    2 FOR indice che va da 0 a lunghezza stringa -1
    3 SWITCH (message[indice])
    3.1 CASE 'A' ...
    3.2 CASE 'B' ...

Chiaro no ? :slight_smile:

Guglielmo

P.S.: Scritto assieme a torn24 ... di cui NON mi piace la soluzione con gli IF

Si in effetti uno switch è più indicato :slight_smile:

for(i=0 ..........)

    switch(s[i]){

         case 'A':
              A();
              break;

    }

So anche che esistono dei puntatori a funzione. Si potrebbe farne un array dove sono ordinate da A() a Z(). Al che il codice diventa solo una for che richiama la funzione corretta, una cosa tipo

//messaggio [] é la stringa, funzioni[] é l'array di funzioni, sono in una for che cicla su i
funzioni [messaggio[i]-'A']

Ma forse é troppo

@Silente ti giuro che un array di puntatori a funzione era la prima cosa che mi è venuta in mente,
ma poi ho pensato che è meglio che uno utilizzi un codice che capisca bene.
Per cui nel dubbio ho proposto una sequenza di if() :wink:

Un array di puntatori a funzione è una soluzione "elegante" ma non è indispensabile in questo caso...

Ciao a tutti, grazie al vostro aiuto per fortuna sono riuscito finalmente a risolvere e a far funzionare il tutto proprio come volevo...

in particolare ho utilizzato il codice suggerito da torn24 sostituendo gli if con lo switch case come detto anche da gpb01...

grazie a tutti!!