Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23

    Problema Getchar()

    Perche' il getchar non mi attende l'inserimento di un carattere da tastiera, nonostante prima pulisca il buffer di tastiera?

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

    Re: Problema Getchar()

    Originariamente inviato da mr_bash
    Perche' il getchar non mi attende l'inserimento di un carattere da tastiera, nonostante prima pulisca il buffer di tastiera?
    Se hai usato fflush(stdin), sappi che il comportamento di fflush sugli stream di input non è definito. fflush è fatta per operare sugli stream di output.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    si, ho usato fflush(stdin)... che rimedio posso utilizzare?

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    help!!

  5. #5
    Non credo che la getchar abbia bisogno della pulitura del buffer.

    In questo caso funziona:
    codice:
    int main() {
        char c;
        c=getchar();
        printf ("\nInserito: %c\n\n", c);
        
        system("PAUSE");
    }
    Altrimenti usa il più consueto scanf("%c", &c);

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    Originariamente inviato da devil89
    Non credo che la getchar abbia bisogno della pulitura del buffer.

    In questo caso funziona:
    codice:
    int main() {
        char c;
        c=getchar();
        printf ("\nInserito: %c\n\n", c);
        
        system("PAUSE");
    }
    Altrimenti usa il più consueto scanf("%c", &c);
    Si, in quel caso funziona, pero' c'e' solo un' operazione di input....
    In un programma con vari input da tastiera la getchar funge in modo casuale...

  7. #7
    Questo thread mi ha incuriosito...in effetti avrei usato anche io la fflush per pulire lo stream di input. Però ha ragione Andbin...non funziona e non deve essere usato questo metodo.
    Ho cercato allora una possibile soluzione su Google (sempre più incuriosito); e ho trovato nei gruppi un codice (l'ho provato su linux) che pone l'stdin in modalità non bufferizzata
    codice:
    #include <stdio.h>
    #include <termios.h>
    #include <sys/ioctl.h>
    
    main()
    {
    struct termios ts;
    struct termios new_ts;
    char c;
    int i;
    ioctl(0, TCGETS, &ts);
    new_ts = ts;
    new_ts.c_lflag &= !ICANON;
    new_ts.c_lflag &= !ECHO;
    ioctl(0, TCSETS, &new_ts);
    
    for( i = 0; i < 10; i++ )
    {
      c=getchar();
      printf("%c\n",c);
    }
    Il bello è che funziona. Se lo esegui il prg sta in attesa di un tasto e qualsiasi tasto inserisci te lo passa senza attendere il cr-lf
    Probabilmente non ti serve a nulla ma in fondo a qualcuno potrebbe interessare (ha me ha incuriosito...non mi ero mai posto il problema che la fflush stdin non funzionasse).


    PS: allego il link di dove l'ho trovato link

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23
    Originariamente inviato da fastcoder
    Questo thread mi ha incuriosito...in effetti avrei usato anche io la fflush per pulire lo stream di input. Però ha ragione Andbin...non funziona e non deve essere usato questo metodo.
    Ho cercato allora una possibile soluzione su Google (sempre più incuriosito); e ho trovato nei gruppi un codice (l'ho provato su linux) che pone l'stdin in modalità non bufferizzata
    codice:
    #include <stdio.h>
    #include <termios.h>
    #include <sys/ioctl.h>
    
    main()
    {
    struct termios ts;
    struct termios new_ts;
    char c;
    int i;
    ioctl(0, TCGETS, &ts);
    new_ts = ts;
    new_ts.c_lflag &= !ICANON;
    new_ts.c_lflag &= !ECHO;
    ioctl(0, TCSETS, &new_ts);
    
    for( i = 0; i < 10; i++ )
    {
      c=getchar();
      printf("%c\n",c);
    }
    Il bello è che funziona. Se lo esegui il prg sta in attesa di un tasto e qualsiasi tasto inserisci te lo passa senza attendere il cr-lf
    Probabilmente non ti serve a nulla ma in fondo a qualcuno potrebbe interessare (ha me ha incuriosito...non mi ero mai posto il problema che la fflush stdin non funzionasse).


    PS: allego il link di dove l'ho trovato link
    Purtroppo utilizza delle librerie non standard, ed io, visto che e' un progetto per l'uni, non le posso utilizzare...

    Io ho provato con setbuf(stdin, NULL) e con setvbuf(stdin, NULL, _IONBF, 0) prima di ogni operazione di input, per non "bufferizzarle". Però anche in questo caso la getchar() a volte funge e altre volte no...

  9. #9
    Mi spiace...

  10. #10
    Utente di HTML.it L'avatar di eclips
    Registrato dal
    Apr 2005
    Messaggi
    48
    a me invece funziona questo codice qui:
    codice:
    #include <stdio.h>
    #include <conio.h>
    
    int main() {
        char c;
       char v;
       
        c=getch();
        printf ("\nInserito: %c\n\n", c);
         v=getch();
        printf ("\nInserito: %c\n\n", v);
         v=getch();
        printf ("\nInserito: %c\n\n", v);
        
        system("PAUSE");
        return 0;
    }
    (chiedo scusa a devil89 per aver preso il suo codice)
    saluti

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.