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

    [C] Primo gets() ignorato... perchè?

    Salve a tutti. Ho un problema. Quando entro nella procedura Write(), il primo gets() del ciclo viene ignorato... come è possibile?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void Write ()
    {
         FILE *f;
         f =fopen ("numbers.txt", "w");
         
         char n[16];
         while (1)
         {
               printf ("insert a number ('e' for exit): ");
               gets (n);
               
               if (!strcmp (n, "e"))
                  break;
               
               fprintf (f, "%s\n", n);
         }
         
         fclose(f);
         printf ("----------\n\n");
    }
    
    void Read()
    {
         FILE *f;
         f =fopen ("numbers.txt", "r");
         
         int x;
         fscanf (f, "%d", &x);
         while (!feof (f))
         {           
               printf ("%d * 2 = %d\n", x, x * 2);
               fscanf (f, "%d", &x);
         }
         
         fclose (f);
         printf ("----------\n\n");
    }
    
    int main ()
    {
        int option;
        while (1)
        {
              printf ("1. Write on file\n");
              printf ("2. Read from file\n");
              printf ("3. Exit\n---> ");
              scanf ("%d", &option);
              
              if (option == 1)
                   Write ();
              else if (option == 2)
                   Read ();
              else if (option == 3)
                   break;
        }
        
        return 0;
    }

  2. #2
    Il solito problema del carattere di ritorno a capo, che rimane nel buffer dello stream stdin.
    Modifica la main così

    codice:
    int main ()
    {
    	char option;
    	do
    	{
    		printf ("\n1. Write on file\n2. Read from file\n3. Exit\n---> ");
    		option = getchar();
    		while( getchar()!='\n');
    		if (option == '1')
    			Write ();
    		else if (option == '2')
    			Read ();
    	}
    	while(option != '3');
    	return 0;
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Ho risolto inserendo getchar() dopo aver letto la variabile option Comunque ancora non mi è chiaro perchè succede questo o_O

  4. #4
    Originariamente inviato da Dreamer89
    Ho risolto inserendo getchar() dopo aver letto la variabile option Comunque ancora non mi è chiaro perchè succede questo o_O
    La tua soluzione è un pò ingenua, infatti il problema si ripresenterebbe comunque se l'utente inserisse più di un carattere, e addirittura crasherebbe se invece di un numero inserisse una lettera o altro carattere.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    In molti compilatori il problema si può risolvere inserendo un
    codice:
    fflush(stdin);
    prima della gets. In ogni caso evita assolutamente la gets in favore della fgets, più sicura.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Originariamente inviato da MItaly
    In molti compilatori il problema si può risolvere inserendo un
    codice:
    fflush(stdin);
    prima della gets. In ogni caso evita assolutamente la gets in favore della fgets, più sicura.
    Ma fgets serve per leggere dal file no? Io devo leggere dalla tastiera

  7. #7
    Con fgets(buffer,stdin,dimensioni del buffer) puoi leggere anche da tastiera (visto che stdin è un normale stream e corrisponde all'input da tastiera), evitando problemi di buffer overflow.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    scusa ma stdin non dovrebbe essere l'ultimo argomento?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Sì ... un piccolo lapsus ... deve essere

    fgets(buffer, dimensioni del buffer, stdin)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Pardon, uso di rado la libreria IO standard C e non sempre mi ricordo a memoria l'ordine dei parametri (ma dove la memoria tradisce IntelliSense dà una mano ).
    Amaro C++, il gusto pieno dell'undefined behavior.

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