|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 50
|
[C]Uso opzioni alfanumeriche "simil BASH"
Ciao a tutti ,
volevo sapere in che modo C può utilizzare opzioni alfanumeriche come per esempio fa in bash il comando cmp: Codice HTML:
$ cmp -n2 file Io mi ritrovo in una situazione simile,in cui devo lanciare da riga di comando un programma C con un opzione che richiede un limitatore numerico. La sitassi della riga è la seguente Codice HTML:
$ ./prog -n arg1....argn e devo arrivare ad avere Codice HTML:
$ ./prog -nm arg1....argn sono riuscito a implementare l'opzione attraverso la libreria <string.h> ma nn ho idea di come fare per implementare m,l'intero limitatore. scusate se ho scritto qualche imprecisione ma al momento non ho il codice sotto mano e spero di essere stato il più chiaro possibile |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Leggi il parametro e vedi a quanto è impostato il limite massimo, poi per ogni argomento (che non è un'opzione) incrementi un contatore e confronti col limite: se lo hai superato, smetti di considerare gli argomenti.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 50
|
aspetta, dopo che sono riuscito ad acquisirlo da riga di comando so come gestirlo, il problema è fargli prendere l'opzione
questo è il pezzo di codice interessato: Codice:
if ((strcmp(argv[2],"-lm")) == 0) { //strcmp è metodo di <string.h>
j=1;
for (i = c-1; i > 0; --i) {
if(j<m){
printf("Il %d numero e' = %d\n", j, array[i]);
++j;
}else{break;
}
}
}
se io gli passo Codice HTML:
$ ./prog -l5 arg1...argn |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
In tal caso -lm non può funzionare, fai così:
Può sembrare un po' cervellotico ma credo sia la maniera più corretta di farlo (se non ti appoggi a routine esterne preconfezionate). ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 50
|
questo è il mio codice modificato, spero come intendevi tu. Questa è un altra sezione del mio programma che in parole povere ordina in maniera crescente e si dovrebbe bloccare una volta che il la scansione dell'array arriva ad un numero maggiore del limite "-ln"
Codice:
if ((strcmp(argv[1],"-l")) == 0) {
if(&argv[1][2]!=NULL){ //ho usato direttamente l'argomento
k=strtol(&(argv[1])[2],NULL,10);
sort(array, c);
for (i = 0; i < c; ++i) {
if(array[i]<=k){
printf("Il %d numero e' = %d\n", i + 1, array[i]);
}else{
free(array);
break;
}
}
free(array);
}
printf("limited!\n");/*LIMITED*/
}
Codice HTML:
$./prog -l 7 6 4 9 0 Il 1 numero e' = 0 *** glibc detected *** ./cv: double free or corruption (fasttop): 0x08867008 *** |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Aspetta, ci sono alcuni errori.
Innanzitutto lo strcmp() ad inizio blocco controlla se la stringa è esattamente quella, non se inizia per quella: usa strncmp() per confrontarne solo una porzione. Poi, con il blocco: Codice:
if(&argv[1][2]!=NULL) Con questa riga: Codice:
k=strtol(&(argv[1])[2],NULL,10); Io direi: Codice:
char *error;
n = strtol(stringaColNumero, &error, 10);
if (*error != '\0') /* ringrazio ||ElChE||88 per aver corretto la mia castroneria :D */
{
/* gestisci l'errore */
/* esci */
}
/* altrimenti usa il numero n */
Togli il free() prima del break.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 09-05-2009 alle 18:04. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Codice:
int main(int argc, char **argv)
{
long value;
char *end;
if (argc <= 1)
return 1;
if (strncmp(argv[1], "-l", 2) == 0)
{
value = strtol(argv[1] + 2, &end, 10);
if (*end != '\0')
{
printf("L'argomento e' nel formato sbagliato.\n");
}
else
{
printf("Il valore e': %ld.\n", value);
}
}
return 0;
}
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Hai ragionissima, errore mio.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
C'è rimasto da dire, a questo punto, che se strtol() restituisce 0 allora l'opzione è soltanto -l (senza numeri postfissi).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
O -l00000... Per quel che gli interessa non credo sia rilevante.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
E ammetto che un po' paura la fanno anche a me.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Apr 2009
Messaggi: 50
|
ok grazie ragazzi, adesso mi funziona tutto perfettamente;-)
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:24.




















