View Full Version : [C] fgets
Allora ho questo problema:
per inserire la linea di parole compreso lo spazio ho usato fgets come suggerito, il mio problema è nell'inserimento, sembra che non si fermi a chiedermi cosa inserire e passi subito alla domanda successiva... perche????
printf("Inserisci l'oggetto dell'appuntamento\n");
//scanf ("%s",&dati_appunti[xx].oggetto);
strcat(testo,dati_appunti[xx].oggetto);
strcat(testo,";");
system("cls");
printf("Inserisci descrizione appuntamento\n");
fgets(boh,250,stdin);
//scanf ("%s",&dati_appunti[xx].appunto);
strcat(testo,dati_appunti[xx].appunto);
strcat(testo,";");
system("cls");
printf("Inserisci giorno/mese appuntamento\n");
scanf("%s",&phrase);
Fenomeno85
12-11-2005, 18:49
che rimanga nel buffer qualcosa? :wtf:
prova fare un fflush (stdin);
~§~ Sempre E Solo Lei ~§~
Ziosilvio
12-11-2005, 19:43
prova fare un fflush (stdin);
Per la centesima volta: lo standard ANSI C non definisce il comportamento di fflush su uno stream di input, quindi fflush(stdin) non è standard e non è portabile?
Per rimuovere i caratteri di troppo dallo standard input, si può fare così:
while (getchar() != '\n')
;
Per la centesima volta: lo standard ANSI C non definisce il comportamento di fflush su uno stream di input, quindi fflush(stdin) non è standard e non è portabile?
Per rimuovere i caratteri di troppo dallo standard input, si può fare così:
while (getchar() != '\n')
;
na io voglio gli spazi ^^
Ziosilvio
12-11-2005, 19:51
io voglio gli spazi
Infatti il while sulla getchar va dopo la chiamata a fgets.
Infatti il while sulla getchar va dopo la chiamata a fgets.
sono cofuso :stordita: cosa mi serve??
io voglio solo inserire una descrizione in una variabile :S
Ziosilvio
12-11-2005, 23:09
sono cofuso :stordita: cosa mi serve?
Allora: quando tu scrivi qualcosa sulla riga di comando, i caratteri corrispondenti ai tasti che hai premuto vengono inseriti sullo standard input.
Quando chiami fgets, questi caratteri vengono letti dalla funzione uno alla volta e inseriti nella stringa, finché non si arriva alla lunghezza del buffer meno 1, oppure al newline.
Se è successa la prima cosa, ad esempio perché hai chiamato fgets(line,20,stdin) e poi hai scritto "Trentatre trentini entrarono a Trento"), alcuni caratteri (nel caso in esempio, quelli della stringa "entrarono a Trento\n") sono rimasti nello standard input, e verranno utilizzati subito dalla successiva chiamata a scanf, fgets o quel che è.
Per questo motivo, devi ripulire lo standard input prima della chiamata successiva.
A proposito: adesso che ci penso, il codice che avevo postato prima va bene solo se ci sono pezzi avanzati sullo standard input.
Per andare tranquillo, devi usare una variabile ausiliaria di tipo int (che è il tipo restituito da getchar) e fare un confronto non solo con il carattere di andata a capo, ma anche con il segnale di "nessun carattere letto", che si chiama EOF ed è un valore int diverso da qualsiasi valore char.
Così:
while ((c=getchar))!=EOF && c!='\n')
;
Fenomeno85
13-11-2005, 09:57
ziosilvio ho provato a vedere se funzionava solo su windows ma anche su Debian compilando con gcc funziona fflush (stdin)
~§~ Sempre E Solo Lei ~§~
Allora: quando tu scrivi qualcosa sulla riga di comando, i caratteri corrispondenti ai tasti che hai premuto vengono inseriti sullo standard input.
Quando chiami fgets, questi caratteri vengono letti dalla funzione uno alla volta e inseriti nella stringa, finché non si arriva alla lunghezza del buffer meno 1, oppure al newline.
Se è successa la prima cosa, ad esempio perché hai chiamato fgets(line,20,stdin) e poi hai scritto "Trentatre trentini entrarono a Trento"), alcuni caratteri (nel caso in esempio, quelli della stringa "entrarono a Trento\n") sono rimasti nello standard input, e verranno utilizzati subito dalla successiva chiamata a scanf, fgets o quel che è.
Per questo motivo, devi ripulire lo standard input prima della chiamata successiva.
A proposito: adesso che ci penso, il codice che avevo postato prima va bene solo se ci sono pezzi avanzati sullo standard input.
Per andare tranquillo, devi usare una variabile ausiliaria di tipo int (che è il tipo restituito da getchar) e fare un confronto non solo con il carattere di andata a capo, ma anche con il segnale di "nessun carattere letto", che si chiama EOF ed è un valore int diverso da qualsiasi valore char.
Così:
while ((c=getchar))!=EOF && c!='\n')
;
percio devo fare cosi:
while ((c=getchar))!=EOF && c!='\n')
testo = c;
????
AnonimoVeneziano
13-11-2005, 11:08
ziosilvio ho provato a vedere se funzionava solo su windows ma anche su Debian compilando con gcc funziona fflush (stdin)
~§~ Sempre E Solo Lei ~§~
E' impossibile .
Io uso debian da 2 anni, altri miei amici pure.
fflush(stdin) non funziona su debian.
Inoltre anche se funzionasse su debian non è un buon motivo per usarlo. Se funzionasse su Windows e Linux non è detto che funzioni su BeOS o su FreeBSD.
Se non è ANSI C è da evitare come la peste se si vuole avere la portabilità tra compilatori
Ciao
EDIT: Comunque mi sembra strano che fgets() faccia questo problema, tecnicamente non dovrebbe memorizzare anche il carattere di '\n' nell' array di arrivo?
Fenomeno85
13-11-2005, 11:14
E' impossibile .
Io uso debian da 2 anni, altri miei amici pure.
fflush(stdin) non funziona su debian.
Inoltre anche se funzionasse su debian non è un buon motivo per usarlo. Se funzionasse su Windows e Linux non è detto che funzioni su BeOS o su FreeBSD.
Se non è ANSI C è da evitare come la peste se si vuole avere la portabilità tra compilatori
Ciao
EDIT: Comunque mi sembra strano che fgets() faccia questo problema, tecnicamente non dovrebbe memorizzare anche il carattere di '\n' nell' array di arrivo?
a me lo compila e non da nessun problema avrò una versione di debian tarocca.
~§~ Sempre E Solo Lei ~§~
AnonimoVeneziano
13-11-2005, 11:18
a me lo compila e non da nessun problema avrò una versione di debian tarocca.
~§~ Sempre E Solo Lei ~§~
Vabbè, anche a me lo compila :) (Non da neanche un warning, perchè il tipo di argomento passato è quello corretto, un puntatore a un buffer, solo che il tipo di buffer è sbagliato per la funzione fflush(), ma quello va a discrezione del programmatore)
La questione è che poi non fa il suo dovere (Tecnicamente dovrebbe dare un risultato inaspettato, come leggere in un array oltre il suo elemento finale)
FFLUSH(3) Linux Programmer's Manual FFLUSH(3)
NAME
fflush - flush a stream
SYNOPSIS
#include <stdio.h>
int fflush(FILE *stream);
DESCRIPTION
The function fflush forces a write of all user-space buffered data for
the given output or update stream via the stream's underlying write
function. The open status of the stream is unaffected.
If the stream argument is NULL, fflush flushes all open output streams.
For a non-locking counterpart, see unlocked_stdio(3).
RETURN VALUE
Upon successful completion 0 is returned. Otherwise, EOF is returned
and the global variable errno is set to indicate the error.
ERRORS
EBADF Stream is not an open stream, or is not open for writing.
The function fflush may also fail and set errno for any of the errors
specified for the routine write(2).
NOTES
Note that fflush() only flushes the user space buffers provided by the
C library. To ensure that the data is physically stored on disk the
kernel buffers must be flushed too, e.g. with sync(2) or fsync(2).
CONFORMING TO
The function fflush() conforms to ANSI X3.159-1989 (``ANSI C'').
SEE ALSO
fsync(2), sync(2), write(2), fclose(3), fopen(3), setbuf(3),
unlocked_stdio(3)
BSD MANPAGE 1993-11-29 FFLUSH(3)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.