Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371

    [C] Scanf e (forse)buffer

    ultimamente sto studiando il C solo che mi sono venuti dei dubbi sulla funzione scanf

    ho provato a scriver qualche riga di codice :
    codice:
    #include<stdio.h>
    
    void main()
    	{
    	char A;
    	printf("Inserire A: ");
    	scanf("%c", &A);
    	printf("\nA: %c \n", A);
    	}
    qui ho notato che inserendo più di un carattere quello preso in considerazione è solo il primo, quindi inserendo QWE l'output ottenuto è
    A: Q

    ho provato poi a modificare il codice cosi:
    codice:
    #include<stdio.h>
    
    void main()
    	{
    	char A;
    	printf("Inserire A: ");
    	do
    		{
    		scanf("%c", &A);
    		printf("\nA: %c \n", A);
    		}while(A!='\n');
    	}
    in questo caso inserendo QWE l'output ottenuto è stato
    A: Q

    A: W

    A: E

    A:


    ora io ho pensato che il comportamento è dovuto ad un buffer che si riempe e che va quindi ad "inviare automaticamente" l'input ai vari scanf dei successivi cicli, è corretto?
    se si c'è un modo per svuotare questo buffer?

    ciao

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sì, c'è il buffer (ne abbiamo parlato tante volte)

    Puoi svuotarlo esattamente come hai fatto ... con quel ciclo che attende il \n e scarta tutti i caratteri dopo il primo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371
    wow, ho fatto una cosa senza saperlo
    ma se invece vado a svuotare il buffer ma poi mi ritrovo che in realtà non contiene nulla si ferma fino a che non premo invio, o sbaglio?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scrivi così

    while (getchar() != '\n');

    per svuotare il buffer.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371
    e con
    while (getchar() != '\n');
    se il buffer è già vuoto il programma non si blocca attendendo l'input?

  6. #6
    Giusto per pignoleria: se l'utente inserisce un EOF (con Ctrl+D, o redirezionando l'input su un file) quel ciclo diventa un loop infinito. Per questo in genere consiglio:
    codice:
    int ch=0;
    while(ch!='\n' && ch!=EOF)
        ch=getchar();
    (o, se ci si sente particolarmente criptici:
    codice:
    int ch;
    while((ch=getchar())!='\n' && ch!=EOF);
    )
    Originariamente inviato da davidinho
    e con
    while (getchar() != '\n');
    se il buffer è già vuoto il programma non si blocca attendendo l'input?
    Sì, si blocca. Purtroppo il C standard non fornisce alternative portabili per svuotare il buffer a prescindere dal suo contenuto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7

    scanf

    Ciao !!

    ho letto il tuo articolo.Tu usi un C molto vecchio,dovresti usare sempre rimanendo con un C delle caratteristiche che usi,il turbo C++ della borland.Intendo dire che non dovrai imparare una nuova interfaccia,ma è sempre la solita.L'istruzione scanf è sostituita da CIN

    ti faccio un piccolo esempio :

    #include<iostream.h>

    int main()
    [ cout<<" Mi piace studiare il C++";

    ]

    insomma,scanf viene sostituita dall'estrattore cout



    per essere ancora più preciso :

    #include <iostream.h>
    // funzione somma

    float Somma(float x,floaty);
    [
    float r;
    r=x+y;
    return r;
    ]
    int main()
    [
    float a,b,c;
    while (true)
    [
    cout<<" inserisci due numeri ( 0 per uscire);
    cin>>a>>b;
    if (a===&& b==) break;
    c=Somma(a,b);
    cout<< a << "+ "<< b"=" << c << endl;
    ]
    ]

    ciao buona programmazione
    Il C++ è duro,ma è anche interessante
    Enzo1946

  8. #8
    C e C++ sono due linguaggi diversi, "governati" da due standard diversi e che tuttora sono separati e si usano spesso in circostanze differenti. Al di là della sintassi di base identica lo stile "idiomatico" C++ è diversissimo da quello del C.
    Il Turbo C++, tra l'altro, è estremamente vecchio, compila solo per DOS e ha molti punti in cui non è compatibile nemmeno con il più vecchio degli standard C++ (C++98); se si vuole programmare in C++ ci sono numerose alternative migliori, ma in ogni caso non è certo obbligatorio passare da C a C++.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: scanf

    Originariamente inviato da enzo1946
    Tu usi un C molto vecchio
    Scusa Enzo ma quello che hai scritto non ha molto senso ... ad uno che usa il C gli dici di usare il C++ ?

    E perché mai dovrebbe "cambiare" linguaggio?

    Devi rispondere al quesito per il linguaggio proposto non dirgli di cambiarlo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2009
    residenza
    Roma
    Messaggi
    371
    no anche perché il C++ lo so già usare solo che ora per l'università mi è stato richiesto lo studio del C...

    comunque grazie a tutti per le risposte

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.