Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    24

    Alternativa a funzione ATOI

    Ciao a tutti, ho un piccolo problemino.
    In pratica devo estrapolare dai parametri passati alla funzione main gli interi.
    Per adesso ho fatto così;

    int main(int argc,char *argv[])
    {
    int i;
    for (i = 1; i < argc; i++)
    {
    printf ("intero: %d\n", atoi(argv[i]));
    }
    return 0;
    }

    Il fatto è che ho due problemini:
    1- Se passo via riga di comando un carattere, la funzione atoi mi restituisce 0... mentre vorrei intercettare questa cosa per dare un messaggio di errore
    2- Cosa più importante è che se passo una roba tipo 33e, la funzione mi restituire 33 mentre vorrei che mi segnalasse il problema...

    E' possibile? Esiste un'altra funzione?
    grazie
    stefano

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Ad esempio, puoi scorrerti tutta la stringa e controllare che sia composta solamente da caratteri numerici:
    codice:
    int numerico(char *s) {
       int ret = -1;
       int i=0;
       for(i=0; i<strlen(s); i++) ret = ret && ((s[i] >= '0') && (s[i] <= '9'));
       return ret;
    }
    
    int main(int argc,char *argv[])
    {
       int i;
       for (i = 1; i < argc; i++)
       {
          if ( numerico(argv[i]) ) {
             printf ("intero: %d\n", atoi(argv[i]));
          } else {
             printf("Errore: valore non numerico\n");
          }
       }
       return 0;
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Alternativa a funzione ATOI

    Originariamente inviato da stefx78
    Il fatto è che ho due problemini:
    1- Se passo via riga di comando un carattere, la funzione atoi mi restituisce 0... mentre vorrei intercettare questa cosa per dare un messaggio di errore
    2- Cosa più importante è che se passo una roba tipo 33e, la funzione mi restituire 33 mentre vorrei che mi segnalasse il problema...

    E' possibile? Esiste un'altra funzione?
    Altra funzione "standard" no. Devi fare tu una tua funzione un po' più "robusta" e che faccia tutti i controlli del caso.
    Puoi decidere di realizzare una nuova funzione che faccia controlli+conversione oppure una funzione che faccia solo il controllo del formato e che restituisce un true/false. Se true, allora poi puoi passare la stringa ad atoi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Infatti, magari puoi prendere carattere per carattere e controllare
    che il codice ascii sia compreso tra quello dello '0' e quello del '9'.
    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    @LeleFT: mi spiegeresti questo?

    codice:
    ret = ret && ((s[i] >= '0') && (s[i] <= '9'));
    o meglio, dimmi se è corretto quello che penso...
    è sufficiente che una delle tre condizioni sia falsa per fare in modo che a ret venga assegnato il valore di zero.

    certo che sono stupido... non avevo mai pensato che gli operatori condizionali potessero essere utilizzati al di fuori delle espressioni condizionali...

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da ilmo lesto
    @LeleFT: mi spiegeresti questo?

    codice:
    ret = ret && ((s[i] >= '0') && (s[i] <= '9'));
    o meglio, dimmi se è corretto quello che penso...
    è sufficiente che una delle tre condizioni sia falsa per fare in modo che a ret venga assegnato il valore di zero.

    certo che sono stupido... non avevo mai pensato che gli operatori condizionali potessero essere utilizzati al di fuori delle espressioni condizionali...
    Esatto.
    A prima vista per chi non è praticissimo sembrerebbe una cosa strana, ma non lo è affatto.
    Quando io scrivo
    codice:
    a = b + c;
    Assegno alla variabile 'a' il valore dell'espressione (b + c).
    Questo lo posso fare se l'espressione alla destra è nello stesso dominio della variabile che riceverà il valore.

    Ora:
    codice:
    ret = ret && ((s[i] >= '0') && (s[i] <= '9'));
    ret è di tipo booleano, quindi posso assegnargli qualsiasi espressione che sia nel dominio dei booleani. E l'espressione sulla destra è di tipo booleano: vale "vero" se tutti e tre gli operandi sono veri, falso altrimenti.

    E quand'è che vale "vero" e quando "falso"?
    Vale "vero" quando ret è vera (da una valutazione precedente o dall'assegnazione iniziale) ed è vera l'espressione fra parentesi, quindi quando il carattere i-esimo è compreso fra '0' e '9'. In tutti gil altri casi vale falso.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    scusate se sto andando un po' OT... nel caso ditemelo che apro un altro 3d.

    perchè dici che ret è un tipo booleano? non ho mai ben capito questa storia dei tipi boolean in C. in realtà non esiste un tipo boolean e tu dichiari ret come un semplice int...

    quindi quando affermi
    ret è di tipo booleano, quindi posso assegnargli qualsiasi espressione che sia nel dominio dei booleani. E l'espressione sulla destra è di tipo booleano: vale "vero" se tutti e tre gli operandi sono veri, falso altrimenti.
    non riesco a capire perchè ti riferisci a ret definendolo di tipo booleano anche se in realtà è un semplice int...

  8. #8
    Si in effetti non esiste un tipo booelano in C.
    Il risultato di un && però sarà di tipo booleano (nel senso che vale 1 o 0 ).
    Per tanto assegnando a ret , per il compilatore sarà sempre un intero,
    il suo valore però varrà 1 o 0.
    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Infatti.
    Il mio discorso era generale.

    Nel caso del C tutto si riduce ad un intero.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    156
    ok, grazie 1000 per i chiarimenti e scusate ancora l'OT


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.