Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    41

    [c] problemi con fgets

    Ciao a tutti. Ho provato a dare un'occhiata sul forum, ma non son riuscito a trovare niente che mi togliesse i dubbi, quindi posto.

    La prima fgets funziona come sperato, i problemi iniziano con la seconda, infatti sembra che legga una stringa vuota, e non lascia il tempo per inserire tale stringa.

    La cosa strana è che se faccio prima la lettura del nome del file e poi quella della modalità sembra funzionare tutto come dovrebbe.


    Codice PHP:
    do{
            
    char risposta[100], mode[3];
            
    printf("-t to open a text file\n-e to open an hex file\n-q to quit\n\n>");
            
    fgets(modesizeof(mode), stdin);
            if (!
    strcmp(mode"-t")){
                
    printf("Insert the name of the file to open:\n>");
                
    fgets(rispostasizeof(risposta), stdin); //<-----------------------------------------------------------
                
    int i;
                for (
    0;100i++)
                    if (
    risposta[i] == '\n'){
                        
    risposta[i] = \0;
                        break;
                    }
                
    visualizzaFile(risposta);
            }
            else if (!
    strcmp(mode"-e")){
                
    printf("Insert the name of the file to open:\n>");
                
    fgets(rispostasizeof(risposta), stdin);//<-----------------------------------------------------------
                
    int i;
                for (
    0;100i++)
                    if (
    risposta[i] == '\n'){
                        
    risposta[i] = \0;
                        break;
                    }
                
    visualizzaExe(risposta);
            }
            else if (!
    strcmp(mode"-q")) {
                
    esci true;
            }
            else {
                
    printf("\nWrong option.\n");
                
    visualizzaHelp();
            }
        }while(!
    esci); 
    Vi ringrazio per l'aiuto , ciò che mi preme è capire il perchè di questo comportamento anomalo, mi interessa relativamente un soluzione alternativa.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima della fgets inserisci una

    fflush(stdin);

    (anche se non e' standard) per pulire il buffer.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    41
    grazie per la risposta.

    Pensavo anch'io che che il buffer dovesse essere pulito in qualche modo, comunque non funzia ancora.
    .

    Nel ciclo non ci sono problemi, l'opzione per uscire viene eseguita correttamente come l'option default.

    Sembra quasi che venga ignorata la fgets...

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

    Re: [c] problemi con fgets

    Originariamente inviato da Cl4Ba
    char risposta[100], mode[3];
    printf("-t to open a text file\n-e to open an hex file\n-q to quit\n\n>");
    fgets(mode, sizeof(mode), stdin);
    Oh ... è semplicissimo. In linea generale, fgets deposita nel buffer i caratteri digitati, il carattere di newline '\n' e poi, in ogni caso, il carattere nullo. Ma se non c'è spazio a sufficienza, i caratteri in più e il newline rimangono nel buffer dello standard-input.

    Avendo fatto un buffer di 3 char, tu inserisci 2 caratteri e il buffer contiene appunto 3 caratteri 'C' 'C' '\0' (C è un carattere). Ma il newline rimane nel buffer dello standard input e viene subito letto senza richiedere input all'utente dalla seconda fgets.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    41
    grazie mille per il chiarimento.
    Effettivamente aumentando la dimensione del buffer il problema sparisce.

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.