Newsgroup: it.comp.lang.c
Titolo: :) c'è un modo per mettere nei case dello switch....

2 parametri per matchare??...mi spiego meglio...
io so che case funziona cosi
switch(code)
  {
    case'v':
    blalbalbk.....
se io voglio mettere nel case '-v'...non funziona cosi semplicemente..
Chi sa aiutarmi?? 
grazie in anticipo...
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 se io voglio mettere nel case '-v'...non funziona cosi semplicemente..
1) '-v' non ha senso.
2) Non siamo in un linguaggio ad alto livello :)
'-v' non e' un carattere, ma una stringa di 2 caratteri (3 se contiamo il 
terminatore di stringa) e la dovresti indicare come "-v"... per fare il 
matching su stringhe ci sono vari algoritmi e varie funzioni.
Devi effettuare il match sui singoli caratteri che compongono la stringa.
Vedi la funzione strstr(), strcmp() o cerca su google "Knuth-Morris-Pratt", 
"Boyer-Moore" e "Rabin-Karp" per avere metodi alternativi e piu' 
efficienti.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 grazie in anticipo...
se le opzioni ti vengono sempre date di tipo
-v
-h
-i
puoi limitarti a controllare stringa[1], mettendo davanti allo switch un
if(stringa[0]=='-' && stringa[2]=='\0')
Ciao,
Riccardo

Correggimi se dico una cazzata...il secondo argomento di argv è
argv[1]...e fin qui ci siamo
ma se voglio considerare il secondo argomento del secondo argomento di
argv si scrive cosi ?? argv[1][1] ?? Sto ipotizzando nn ne sono per
niente sicuro..
TNX


Io i dati li inserisco da riga di comando..argv[1]
e poi li metto in una variabile per poter essere switchata..
int main(int argc,const char *argv[])
{
 
 
      sscanf(argv[1],"%s", &code);
 
 
         switch(code)
        {
                case 'v':   
                printf("%s", str);
                break;
ecc....
come faccio a fargli considerare -v??


 come faccio a fargli considerare -v??
 
HomeWork 4??? no 5!!! :)
Io ho risolto con una cosa del genere:
#include <stdio.h>
#include <unistd.h>
int
main(int argc,char *argv[]){
        int ch;
 
        ch = getopt(argc, argv, "vfFhEGm");
        switch(ch){
                case 'v':
                        break;
 
                case 'f':
                        break;
 
 
                case 'F':
                        break;
 
 
                case 'h':
                        break;
 
 
                case 'E':
                        break;
 
 
                case 'G':
                       break;
 
 
                case 'm':
                        break;
        }
        return 0;
}
Spero non sia la soluzione peggiore. 
Ciao.

Ciao SBis che corso fai==? cioč che canale freq??


 Ciao SBis che corso fai==? cioč che canale freq??
CMQ un'altra cosa..in quel modo nn considera -f o -v ecc considera solo
le lettere...oppure o fatto qualche errore ma nn credo..TNX CMQ


 niente sicuro..
argv[0] e' il nome del programma (con o senza path, a seconda del sistema 
operativo, e forse del modo con cui lanci l'eseguibile)... comunque non 
riguarda lo standard ANSI C.
argv[1] e' il primo parametro passato al programma
argv[1][0] e' il primo carattere del primo parametro
argv[1][1] e' il secondo carattere del primo parametro
E cosi' via.


 e poi li metto in una variabile per poter essere switchata..
Per enumerare tutti i parametri che contengono un opzione singola (definita 
come una stringa che inizia per '-' e ha un solo carattere):
    for (i=1; i<argc; i++)
        if (argv[i][0] == '-' && argv[i][2] == '\0')
            printf("Opzione trovata: %s\n", argv[i][1]);
(e' quello che ti e' stato suggerito prima, solo applicato a una printf per 
farti vedere il risultato)
Se invece accetti opzioni multiple ("-quellochetipare", dove 'q', 'u', etc. 
sono singole opzioni distinte valide):
    printf("Opzioni trovate: ");
    for (i=1; i<argc; i++)
        if (argv[i][0] == '-')
            printf("%s", argv[i]+1);
    putc('\n');
Tanto per farti una panoramica un po' piu' ampia, questi sistemi:
- non supportano gli argomenti lunghi, nella forma --nome-opzione
- non hanno una memoria per le opzioni trovate
- ignorano che in alcuni casi, se prima ho trovato un'opzione, dopo potrei 
  trovare un parametro che devo considerare come il valore di quell'opzione 
  e che va' parsificato in modo diferso;
  es: -f nomefile_da_aprire
  dovresti interrompere la normale procedura di parsing e considerare in 
  modo speciale quello che sta dopo l'opzione (tipicamente te la salvi da 
  qualche parte per la fase successiva)
  Per fare una cosa simile dovresti avere una tabella a parte in sui sono 
  elencate le varie opzioni e per ogni opzione ne definisci le proprieta' 
  (puo' avere un valore, deve avere un valore, non deve avere un valore, 
  etc.
Sinceramente a me non piace il sistema di getopt (che ti ha suggerito sbis), 
preferisco un sistema in cui si ha un controllo maggiore della scansione di 
argv. Se ti serve qualcosa di fatto meglio dai un occhiata al metodo 
utilizzato da Gnome per il parsing degli argomenti.


grazie ma ho risolto nel modo piu semplice..bastava fargli controllare
il secondo parametro
di argv cioč argv[2][1]...grazie a tutti per la collaborazione...


 '-v' non e' un carattere, ma una stringa di 2 caratteri (3 se contiamo il
No, quella che ha utilizzato lui è una costante multicarattere. Lo standard
non  escplicita un utilizzo effettivo, ma ogni implementazione può farvi
corrispondere "un carattere" multibyte secondo le proprie esigenze.
Ciao.