Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C] Controllo sul tipo

    Ciao ragazzi,
    ho un problema che veramente non riesco a risolvere.
    Come faccio in C a controllare che l'utente ha inserito veramente un numero in un range?

    Esempio:
    Menù con scelte:
    1) Scelta 1
    2) Scelta 2
    3) Uscita

    Bene, diciamo che controlliamo l'inserimento cosi:


    do
    {
    printf("Scelta:");
    scanf("%d",%s);
    }
    while(s<1 || s>3);


    Però...se inserisco un carattere o un numero decimale il programma va in crash! Come faccio? Ho provato anche con delle funzioni che controllano che sia un carattere o meno, ma il problema è che già la scanf va in crash se si aspetta un intero e le si passa un carattere o un numero decimale.

    Sapreste aiutarmi? Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Qualcosa del genere, nel tuo caso, potrebbe andare

    codice:
    #define N 20
    
    ...
    
    char s[N+1];
    
    do
    {
      printf("Scelta: ");
      fgets(s, N,  stdin);
    } while(atoi(s)<1 || atoi(s)>3);

  3. #3
    usando la scanf non è possibile proprio? purtroppo è una cosa scolastica e sono limitato nell'uso di altre funzioni..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Puoi usare la

    scanf("%s", s);

    al posto della fgets ... ma quest'ultima e' piu' sicura ...

  5. #5
    Allora...
    il programma va in stallo (ciclo infinito) perchè si aspetta un int(ero) invece inserisci un char(attere). Per far si che tutto funzioni bene devi memoriazzare il carattere letto in una variabile carattere e cambiare la condizione di uscita del ciclo while:
    while(s!=49 || s!=50 || s!=51)

    48 in ASCII è 0
    49 in ASCII è 1
    50 in ASCII è 2
    51 in ASCII è 3
    ...
    _________
    roxxy86

  6. #6
    uhm..si potrebbe anche fare direttamente con il carattere tra apici.
    Ok..ma mettiamo invece che devo acquisire un numero..diciamo 123.45!

    Come faccio a controllare che è un numero (con punto) e non una lettera o un numero con virgola (che non viene accettato)?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Allora utilizzi la atof al posto della atoi

    codice:
    #define N 20
    
    ...
    
    char s[N+1];
    
    do
    {
      printf("Scelta: ");
      scanf("%s", s);
    } while(atof(s)<1.5 || atof(s)>3.8);

  8. #8
    in effetti.. con gli apici è molto più leggibile, però anche i numeri sono carini!!
    ..con il metodo che t'ho detto io riesci a leggere solo un carattere alla volta!
    per cui bisogna pensare ad un altro modo.
    PENSO...

    OK

    Modo 1) leggi una stringa (o array di caratteri) e poi la converti (con una funzione STD) in double. Se la conversione non avviene, richiedi il numero (con un ciclo while).

    --> Modo 2) leggi direttamente un double (mi sembra tu debba usare %f) in questo modo però se inserisci un carattere il prg va in stallo.

    Modo 3) richiedi un carattere di terminazione( es. "-" ): se l'utente vuovle inserire 3.456, dovra inserire 3.456-. (gestisci il tutto con due cicli while uno annidato all'altro).

  9. #9
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    se no credo che puoi fare uno scanset... nel tuo caso (che vuoi solo che accetta numeri o il punto) dovrebbe funzionare così:

    scanf("%d %[0-9.]",&s);
    fflush(stdin);

    PS: Spero di non aver fatto errori di sintassi... è da una vita che non uso scanf e printf

  10. #10
    Se quella cosa funzionasse sarebbe ottima..ma mi sa che la sintassi non è cosi

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.