Torna indietro   Hardware Upgrade Forum > Software > Programmazione

I nuovi notebook Acer al debutto al Computex 2025
I nuovi notebook Acer al debutto al Computex 2025
Al Computex 2025 di Taipei Acer mostra una completa gamma di soluzioni notebook delle famiglie Swift, Aspire, Predator e Nitro pensati per gli utenti consumer oltre che per coloro che ricercano elevata potenza di elaborazione, per lavorare o per giocare. In base al modello troviamo piattaforme Intel, AMD oppure Qualcomm anche in abbinamento alle nuove GPU NVIDIA GeForce RTX 5000
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom
All'evento globale di Nutanix l'azienda ha presentato una serie di novità mirate a ridurre la dipendenza dalle soluzioni di VMware/Broadcom. Arriva Cloud Native AOS, soluzione che non richiede di appoggiarsi ad hypervisor. Novità per Nutanix Enterprise AI. Potenziata la collaborazione con Pure Storage per uno storage dedicato ad altissime prestazioni
HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha rivali a questo prezzo!
HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha rivali a questo prezzo!
HUAWEI è capace di sorprendere ancora e quest’anno lo fa con questo nuovo smartwatch WATCH FIT 4 Pro che coniuga un design elegante e moderno con funzionalità di prim’ordine. Ultra-sottile con display AMOLED, funzionalità avanzate per sport e salute, e un'autonomia fino a 10 giorni.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-11-2005, 18:26   #1
max246
Senior Member
 
Iscritto dal: May 2005
Messaggi: 340
[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????


Codice:
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);
max246 è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2005, 18:47   #2
ianaz
Senior Member
 
L'Avatar di ianaz
 
Iscritto dal: Jan 2005
Città: London, United Kingdom
Messaggi: 959
ASD MAX
Non ne ho idea
__________________
zattix
ianaz è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2005, 18:49   #3
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8878
che rimanga nel buffer qualcosa?

prova fare un fflush (stdin);

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2005, 19:43   #4
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16209
Quote:
Originariamente inviato da Fenomeno85
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ì:
Codice:
while (getchar() != '\n')
    ;
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2005, 19:48   #5
max246
Senior Member
 
Iscritto dal: May 2005
Messaggi: 340
Quote:
Originariamente inviato da Ziosilvio
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ì:
Codice:
while (getchar() != '\n')
    ;

na io voglio gli spazi ^^
max246 è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2005, 19:51   #6
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16209
Quote:
Originariamente inviato da max246
io voglio gli spazi
Infatti il while sulla getchar va dopo la chiamata a fgets.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2005, 19:53   #7
max246
Senior Member
 
Iscritto dal: May 2005
Messaggi: 340
Quote:
Originariamente inviato da Ziosilvio
Infatti il while sulla getchar va dopo la chiamata a fgets.

sono cofuso cosa mi serve??

io voglio solo inserire una descrizione in una variabile :S
max246 è offline   Rispondi citando il messaggio o parte di esso
Old 12-11-2005, 23:09   #8
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16209
Quote:
Originariamente inviato da max246
sono cofuso 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ì:
Codice:
while ((c=getchar))!=EOF && c!='\n')
    ;
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2005, 09:57   #9
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8878
ziosilvio ho provato a vedere se funzionava solo su windows ma anche su Debian compilando con gcc funziona fflush (stdin)

~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2005, 11:03   #10
max246
Senior Member
 
Iscritto dal: May 2005
Messaggi: 340
Quote:
Originariamente inviato da Ziosilvio
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ì:
Codice:
while ((c=getchar))!=EOF && c!='\n')
    ;

percio devo fare cosi:

Codice:
 
while ((c=getchar))!=EOF && c!='\n')
    testo = c;
????
max246 è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2005, 11:08   #11
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
Quote:
Originariamente inviato da Fenomeno85
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?
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2005, 11:14   #12
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
Iscritto dal: Jun 2002
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8878
Quote:
Originariamente inviato da AnonimoVeneziano
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 ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio.
Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 13-11-2005, 11:18   #13
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
Quote:
Originariamente inviato da Fenomeno85
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)

Codice:
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)
__________________
GPU Compiler Engineer

Ultima modifica di AnonimoVeneziano : 13-11-2005 alle 11:22.
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


I nuovi notebook Acer al debutto al Computex 2025 I nuovi notebook Acer al debutto al Computex 202...
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom Nutanix .NEXT: così l'azienda vuole aiuta...
HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha rivali a questo prezzo! HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha...
Test NIU RQi Sport, vi spieghiamo perché una moto così è perfetta Test NIU RQi Sport, vi spieghiamo perché ...
Start Campus: il datacenter raffreddato dal mare Start Campus: il datacenter raffreddato dal mare
Hideo Kojima morirà, ma la sua cr...
Senti chi parla! Davvero, ora, grazie al...
Tesla sempre peggio in Europa: un'aziend...
Le minacce di Trump funzionano: un altro...
Cosa succede in Amazon? Sconti anomali s...
Flop Call of Duty Warzone Mobile, Activi...
Roborock Qrevo Curv, sconto di 400€ per ...
OLED LG 2024 in sconto su Amazon: 55'' S...
Claude AI inventa una citazione in tribu...
HP Victus con GeForce RTX 4070 e Intel C...
Samsung Galaxy S25 Ultra scende ancora d...
Ancora più giù i prezzi di...
Usare le scorie nucleari per ottenere en...
Dreame L40S Pro Ultra vs Dreame X40 Ultr...
OpenAI Codex scrive codice e lo testa da...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:37.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v