|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
[C] errore inspiegabile?
aiutoooooooooooo
non so assolutamente come risolvere questo problema..questo pezzo di codice NON mi funziona: char newExp[256]; char yon = 'n'; int i; while(yon == 'n') { printf("Nuova espressione corrente:\n"); //scanf("%s", newExp); fgets(newExp, 256, stdin); //gets(newExp); printf("La nuova espressione corrente e':\n%s\nVuoi mantenerla?", newExp); yon = getc(stdin); } for(i = 0; i < 256; i++) { currentExp[i] = newExp[i]; } ho commentato scanf e gets perchè ho provato ad usare anche loro ma con scarsi risultati (nonostante la mia intenzione di utilizzare solo fgets). in pratica a run time non mi dà la possibilità di inserire la nuova espressione..come se saltasse quell'istruzione...probabilmente sarà un bug idiota ma io non ho la minima idea di cosa fare!! aiut |
|
|
|
|
|
#2 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quando scrivi sullo standard input che non vuoi tenere l'espressione inserita, inserisci prima un carattere 'n', e poi un newline.
Dopo la chiamata a getc, il newline rimane nel buffer: ed è quel newline, che viene letto da fgetc e interpretato come una riga in cui c'è solo l'andata a capo. Per risolvere questo problema, devi togliere i caratteri dopo 'n' (o 's'); ad esempio con: Codice:
while (getc(stdin) != '\n')
;
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Ziosilvio man getc mi dice questo
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error. getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once. non riesco a capire la differenza tra getc e fgetc... |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
Quote:
|
|
|
|
|
|
|
#5 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
La differenza è che fgetc è sempre implementata come funzione, mentre getc potrebbe essere implementata anche come macro: in questo caso, lo standard non richiede che getc valuti il suo argomento una volta sola. Un esempio di come questo possa avvenire si trova nella sezione 8.5 del K&R, e mi permetto di riportarlo qui: Codice:
#define getc(p) (--(p)->cnt >= 0 ? (unsigned char) \
*(p)->ptr++ : _fillbuf(p))
Ricapitolando, tu hai la scelta tra fgetc, che garantisce una maggiore robustezza agli effetti collaterali; e getc, che potrebbe offrire una velocità maggiore.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 27-03-2006 alle 01:14. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
ok ho capito.
ma gli effetti collaterali che si potrebbero avere nell'utilizzo della getc si avrebbero nel caso in cui l'argomento (p) cambi il proprio valore tra la prima e la seconda valutazione (nel caso in cui getc è implementato come macro e con più alutazioni dell'argomento, come hai scritto tu), ma questa sarebbe comunque una possibilità remota giusto? e inoltre come si farebbe a far cambiar valore al file descriptor passato per argomento? grazie Ziosilvio, sempre puntuale e impeccabile. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
Quote:
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#8 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Inoltre, l'evento che p cambi da un punto all'altro di getc, è improbabile se p è un descrittore "unico" come stdin; ma vedi da te che le cose possono essere diverse se è un elemento di un array di descrittori di file. Ossia: in linea di principio è possibile scrivere monnezze tipo: Codice:
FILE *inputs[10]; /* bla bla bla */ i = getc(inputs[++j]);
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#9 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
... venticinque, ventisei, ventisette... ... ottantadue, ottantatre, ottantaquattro... ... novantanove, CENTO! OK, sono calmo, posso rispondere. Come io stesso e altri abbiamo già spiegato un nutrito numero di volte, e come è detto in uno dei thread in prima pagina oggi in risposta a un quesito simile, lo standard non definisce il comportamento di fflush su uno stream di input. Per cui, anche se molti compilatori accettano l'espressione fflush(stdin) e la interpretano come un'eliminazione dei caratteri rimasti sullo standard input, chiamare fflush su uno stream di input non è né standard né portabile, e lo si fa a proprio rischio e pericolo.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1455
|
Quote:
Appena visto il thread a cui ti riferivi, grazie della risposta.
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:37.


















