PDA

View Full Version : [C]chiarimenti su costrutto switch


tookie
08-05-2009, 16:04
ciao a tutti,

volevo sapere se qualcuno può indicarmi un modo per usare il costrutto switch-case, con stringhe o char


#include <stdio.h>

int main(int argc,char** argv[]){

switch ( argv[1]) {
case 'r':

printf("reverse!\n");
break;
case 'l':

printf("limited!\n");
break;
default:

printf("normal!\n");
break;
}


}

in questo semplice programma ho provato a farlo andare passandogli da riga di comando argv[1](il main devo lasciarlo cosi perchè devo unire questo segmento di codice ad un altro programma che necessita di quei parametri), e da quel che so argv è un array di argomenti lungo argc, letti come char, perciò dato che switch dovrebbe funzionare con quasi tutti i tipi numerici e char non capisco perchè mi ritorni

prgramma_semplice.c:5: error: switch quantity not an integer


ho cercato un pò in rete ma nessuna soluzione ha funzionato, e in alcuni casi queste hanno creato maggiori guai...ho provato anche ad assegnare ad una variabile char x il valore di argv[1] ma niente

british
08-05-2009, 16:53
intanto i parametri del main che hai postato sono scorretti:

argc va bene di tipo int
argv invece è un array di stringhe, che puoi vedere:

o come un array di array di caratteri e in tal caso lo indichi come *argv[]
o come un puntatore a un puntatore a carattere e in tal caso lo indichi come **argv


le due versioni sono sostanzialmente equivalenti proprio per l'equivalenza, in C, tra puntatori e array


premesso ciò, argv[1] non è un char, bensì è il secondo elemento di argv e per quanto detto sopra è un array di caratteri.

tornando a bomba:

se vuoi effettuare lo switch su argv[1] e ( argv[1] è lungo un solo carattere oppure vuoi prenderne solo il primo carattere ) allora puoi fare:

switch ( argv[1][0] )

( prendendo esplicitamente il primo elemento di argv[1] )
oppure

switch ( *argv[1] )

( dereferenziando il puntatore )

così accedi al primo carattere della seconda stringa contenuta in argv.

se invece vuoi switchare su delle stringhe di lunghezza arbitraria... beh non puoi, in quanto lo puoi fare solo su valori interi ( o promuovibili a intero, come un char )

l'alternativa è andare di if - strcmp - else, oppure usare qualche tipo di hash

spero di non essere stato troppo incomprensibile

ciao!

british

P.S.

prima di accedere a qualsiasi titolo a elementi di argv ricordati di controllare che esistano attraverso argc, altrimenti il crash del programma è garantito

tookie
08-05-2009, 17:32
grazie ma questa era una soluzione che mi aveva generato un ulteriore problema, infatti adesso con questa sintassi

.....
int main(int argc,char *argv[]){

switch (*argv[1]) {
case 'r':

printf("reverse!\n");
break;
.....


mi genera un segmentation fault, che dovrei riuscire a risolvere utilizzando il comando malloc, ma questo è utilizzabile su argv?
o è meglio che crei un altro array su cui salvo tutti gli argomenti passati sulla riga di comando e applico malloc e switch sull'array appena creato?
oppure se hai qualche altra soluzione migliore son tutto orecchie:D

british
08-05-2009, 17:59
:wtf: a me funziona... sei sicuro che argv[1] esista? ( ovverosia che argc > 1 ovverosia che effettivamente gli passi l'argomento sulla linea di comando )

ciao!

british

tookie
08-05-2009, 18:17
ah si scusa son proprio fuso oggi, mi ero dimenticato di passargli l'argomento :asd:

Grazie mille per avermi aiutato:D