Newsgroup: it.comp.lang.c
Titolo: Switch/case e stringhe

La mia situazione è: leggo una stringa che può assumere determinati valori,
in base ai quali mi comporto in modo diverso. La scelta più pratica era di
usare il costrutto switch/case, però sembra che non si possano usare le
stringhe come vorrei invece fare.
switch (comando) {
    case "HELP": case "help":
        ...
        break;
  case "USER": case "user":
        ...
        break;
  case "PASS": case "pass":
        ...
        break;
}
Come posso realizzare una situazione di questo tipo?
Grazie in anticipo per le risposte.
Steve

 Steve
Ciao
Matic

 stringhe come vorrei invece fare.
Ammesso che non ti vangano conati di vomito, questa e' una soluzione.
Capire perche' e' bene tenersi abbastanza alla larga da questa
soluzione (soprattutto se non e' chiaro il perche' di quegli strani
define) e' lasciato come facile esercizio.
#include <stdio.h>
#include <string.h>
#define HELP (((('P'<<8)|'L')<<8|'E')<<8)|'H'
#define USER (((('R'<<8)|'E')<<8|'S')<<8)|'U'
#define PASS (((('S'<<8)|'S')<<8|'A')<<8)|'P'
union {
   char str[4];
   int  cnvStr;
} pippo;
int main(void)
{
   strncpy(pippo.str, "USER", 4);
   switch(pippo.cnvStr)
   {
      case HELP : break;
      case USER : break;
      case PASS : break;
      default : break;
   }
   return 0;
}
C:\>iao Angelo
P.S. Qualunque sia la soluzione, faresti bene a convertire le
     stringhe tutte in maiuscolo o tutte in minuscolo, prima
     di qualsiasi altra operazione.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Ammesso che non ti vangano conati di vomito, questa e' una soluzione.
Non è affatto male come soluzione ;)
-- 
Tnk
Luca "Kleidemos" Francesca
Un computer a un altro quando si incontrano:
"Ciao, come ti boota oggi???"

 Non è affatto male come soluzione ;)
Ripeto: e' una soluzione da prendere con le molle. Ha parecchie
limitazioni e fa diverse assunzioni sull'architettura sottostante.
Spero non ti sia sfuggita la "finesse" del define con le stringhe
al rovescio. :-)
C:\>iao Angelo


 al rovescio. :-)
L'ho molto apprezzata come soluzione.
Anche se un po troppo piena di assunzioni è molto bella come stile.
I miei vivi complimenti :D


Angelo Paolitto ha scritto:
 >
 >#define HELP (((('P'<<8)|'L')<<8|'E')<<8)|'H'
 >#define USER (((('R'<<8)|'E')<<8|'S')<<8)|'U'
 >#define PASS (((('S'<<8)|'S')<<8|'A')<<8)|'P'
Giusto x curiosita.
Mi spiegheresti cosa fa esattamente questo cosi da fugare ogni mio dubbio???
Io penso facia uno shift di 8 trasformandolo in numero ma nn sono molto 
esperto di shift.


 esperto di shift.
Se provi ad eseguirti a mano l'algoritmino, passo passo, ti si dovrebbe 
chiarire tutto.

 esperto di shift.
il codice equivalente alle define e' quello riportato sotto
  int ppp;
   ppp = 'P';
   ppp = ppp <<8;   // sposta di 8 bit il valore di ppp
   ppp = ppp | 'L'; // accoda 'L' in ppp
   ppp = ppp <<8;   // ecc., ecc.
   ppp = ppp | 'E';
   ppp = ppp <<8;
   ppp = ppp | 'H';
Il problema principale della soluzione e' che funziona solo su
architetture big-endian (x86, per fare un nome).
Un altro problema e' dato dal fatto che funziona solo se
le stringhe utilizzate sono tutte in maiuscolo (poco male) e
composte tutte da 4 caratteri. Se ne hanno meno, leggendo l'int
della union si legge un valore che dipende da cosa era stato
inserito in precedenza nell'array della union.
Sembra che la soluzione non abbia problemi con interi di 64 bit,
ma non ne sono sicuro al 100%.


 stringhe come vorrei invece fare.
infatti non si puo'
Visto che hai comunque ricevuto delle risposte per cosi' dire
"fantasiose", eccone un'altra...
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
char *tmp_tmp;
#define SWITCH(x)  tmp_tmp=x; if(0)
#define CASE(y)   } else if (!strcmp(tmp_tmp,y)) {
#define DEFAULT   } else {
int main()
{
  char *s,Comando[80];
  strcpy(Comando,"uSeR");
//converto tutto in maiuscole cosi' non ci si pensa piu' !
  for (s=Comando; *s; ++s) *s=toupper(*s);
SWITCH(Comando)
{
   CASE("ABORT")
      printf("Ho scelto <ABORT>\n");
   CASE("CIAO")
       printf("Ho scelto <CIAO>\n");
   CASE("USER")
     printf("Ho scelto <USER>\n");
   DEFAULT
     printf("Nessuna di queste\n");
     printf("Ritenta e sarai piu' fortunato !\n");
}
return 0;
}
ciao,
g.