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

    [C] Scanf capricciosa..

    Salve ragazzi, ho un problema a dir poco assurdo...la scanf in C mi da problemi se faccio una lettura di un carattere dopo aver fatto quella di un numero...esempio:

    #include <stdio.h>
    #include <stdlib.h>

    main()
    {
    int numero;
    char carattere;
    printf("inserisci il numero->");
    scanf("%d",&numero);
    printf("inserisci il carattere->");
    scanf("%c",&carattere);
    system("pause");
    }


    Bene...mandando in esecuzione questo codice, accade che mi chiede il numero, lo inserisco, esegue la printf chiedendomi il carattere e va direttamente alla system("pause"), senza farmi inserire il carattere...insomma non esegue la scanf del carattere.
    Se faccio fare la lettura del carattere prima di quella del numero tutto funziona...

    In realtà ho trovato la soluzione, ovvero inserendo l'istruzione:
    fflush(stdin);
    prima della seconda printf, tutto funziona....ma mi domando PERCHE'?? è strana come cosa...può darsi che sia un problema noto, ma io è da poco che ho messo mani sul C, in passato ho lavorato solo in C++, dove la CIN non m'ha mai dato problemi del genere...

    Ringrazio tutti!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E' un comportamento noto di queste funzioni dato il tipo di funzionamento bufferizzato.

    Devi svuotare il buffer di input della tastiera.

    Fai una ricerca sul forum ... e' un argomento trattato decine di volte ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    569
    Non è una cosa strana. Dopo aver inserito il numero premi INVIO, quindi inserisci un carattere che viene letto dalla successiva scanf. Per risolvere il problema basta aggiungere una scanf.

    #include <stdio.h>
    #include <stdlib.h>

    main()
    {
    int numero;
    char carattere;
    printf("inserisci il numero->");
    scanf("%d",&numero);
    printf("inserisci il carattere->");

    scanf("%c"); /* legge il cr */

    scanf("%c",&carattere);
    system("pause");
    }

  4. #4
    Mah..secondo me è un difetto...poichè se lo faccio come prima scanf, il carattere viene acquisito normalmente. Poi...posso fare 20 scanf consecutive di numeri (o anche stringhe) senza problemi...solo quando faccio una scanf di un carattere singolo e solo se lo faccio dopo altre scanf mi crea il problema...mah...comunque credo che sarò costretto a usare il

    fflush(stdin);

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usa il fflush (anche se non e' standard) ma non e' un "difetto" ...

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    fflush(stdin) non standard? sei sicuro?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non e' che non e' standard la fflush ma il fatto che venga usata sullo stdin

    Visual C (e le sue librerie) lo implementano ma il suo comportamento, in realta', non e' definito e puo' non funzionare con altri compilatori.

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da oregon
    Non e' che non e' standard la fflush ma il fatto che venga usata sullo stdin

    Visual C (e le sue librerie) lo implementano ma il suo comportamento, in realta', non e' definito e puo' non funzionare con altri compilatori.
    ok tutto chiaro.. il mio vecchio libro di c fa un po' ca**are allora...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.