PDA

Visualizza la versione completa : [C] Primo gets() ignorato... perchè?


Dreamer89
15-10-2008, 17:42
Salve a tutti. Ho un problema. Quando entro nella procedura Write(), il primo gets() del ciclo viene ignorato... come è possibile?


#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;
}

Samuele_70
15-10-2008, 18:24
Il solito problema del carattere di ritorno a capo, che rimane nel buffer dello stream stdin.
Modifica la main così



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;
}

Dreamer89
15-10-2008, 18:30
Ho risolto inserendo getchar() dopo aver letto la variabile option ;) Comunque ancora non mi è chiaro perchè succede questo o_O

Samuele_70
15-10-2008, 18:38
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.

MItaly
15-10-2008, 18:43
In molti compilatori il problema si può risolvere inserendo un


fflush(stdin);

prima della gets. In ogni caso evita assolutamente la gets in favore della fgets, più sicura.

Dreamer89
15-10-2008, 19:09
Originariamente inviato da MItaly
In molti compilatori il problema si può risolvere inserendo un


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

MItaly
15-10-2008, 19:24
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.

Dreamer89
15-10-2008, 20:20
scusa ma stdin non dovrebbe essere l'ultimo argomento?

oregon
15-10-2008, 20:37
Sì ... un piccolo lapsus ... deve essere

fgets(buffer, dimensioni del buffer, stdin)

MItaly
15-10-2008, 20:52
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 :) ).

Loading