Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    scanf() in un cilclo

    Volevo provare ad utilizzare la restituzione del numero di argomenti assegnati correttamente da scanf() per chiedere un input numerico fino a quando non sia corretto, ma il codice pare non funzionare.
    Se si inserisce da subito un valore corretto tutto a posto, ma nel caso questo sia un char (od una stringa), allora il ciclo prosegue all'infinito senza chiedere un'altro input, come se la scanf() fallisse l'assegnamento a prescindere.
    Qualcuno in grado di dirmi dove sbaglio?


    codice:
    #include <stdio.h>
    
    /*
     * Il programma prende in input un numero intero, ccntinuando
     * a chiederlo nel caso non sia un valore coretto.
     */
    
    int main()
    {
            int a = 0;
            int intero = 0;
    
            printf("Dammi un numero intero\n");
            do
            {
                    a = scanf("\n%d", &intero);
                    printf("scanf(): %d \n", a );
            } while ( a < 1);
    
            printf("Hai inserito il numero intero %d\n", intero);
    
            return 0;
    }
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Ho aggiunto il linguaggio di programmazione al titolo (sperando di averlo indovinato).

    Non dimenticarlo in futuro!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Si, è vero, scusa. Di solito lo metto, ma stavolta l'ho dimenticato.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    E' necessario ripulire il buffer di input dal carattere INVIO, dopo averlo ricevuto:
    codice:
    #include <stdio.h>
    
    /*
     * Il programma prende in input un numero intero, ccntinuando
     * a chiederlo nel caso non sia un valore coretto.
     */
    
    int main()
    {
            int a = 0;
            int intero = 0;
            char nullo;
    
            printf("Dammi un numero intero\n");
            do
            {
                    a = scanf("\n%d", &intero);
                    printf("scanf(): %d \n", a );
                    scanf("%c", &nullo);
            } while ( a < 1);
    
            printf("Hai inserito il numero intero %d\n", intero);
    
            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

  5. #5
    Ma il secondo scanf non chiede valori? Semplicemente ripulisce? Strano, non ho trovato nulla di simile nella documentazione.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

  6. #6
    Originariamente inviato da LeleFT
    E' necessario ripulire il buffer di input dal carattere INVIO, dopo averlo ricevuto:
    ...
    No bisogna svuotarlo completamente il buffer !
    E per fortuna esiste una funzione apposita :

    codice:
            ...
            fflush( stdin ); // Prima della scanf()
            a = scanf("\n%d", &intero);
            ...
    Questo risolve il problema.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Quindi on si svuota da solo dopo una chiamata a scanf... non lo sapevo. Grazie mille ad entrambi Siete stati chiarissimi.
    GreyFox (Linux registered user #435102)
    greyfox.imente.org - GreyFox's shots (photo gallery)
    $ cd /pub
    $ more beer

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 © 2025 vBulletin Solutions, Inc. All rights reserved.