|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
[C] 2 domande
la prima:
mi serve il comando che mi manda direttamente alla fine del programma, saltanto tutto quello che viene dopo. la seconda (un po' più complessa): voglio fare una if che parta a seconda che una variabile sia uguale o meno ad un certo carattere. io ho cominciato così: dichiaro la variabile "var" come char metto una scanf del tipo: scanf("%c", var) poi però non so più cosa mettere come condizione della if... ho provato con if( var == y) dove y è la lettera che voglio che attivi la if, ma non funziona... idee? grazie mille
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2451
|
Per la prima puoi fare un return 0; o un exit(0);
Per la seconda, nel confronto dei caratteri devi usare gli apici singoli Codice:
if(var=='y') ...
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
aspè che ci riprovo... avrò sbagliato qualcosa... grazie mille
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
doh... funziona... ma non del tutto... cioè... ci devo aver sparato dentro qualche errore Codice:
printf("[y/n]?");
scanf("%c", &q);
if(q == 'y') {
printf("lol");
scanf("%f", &var);
}
else {
printf("[y/n]?");
scanf("%c", &q);
if(q == 'y') {
printf("lol2");
scanf("%f", &var2);
}
else {
printf("doh");
end(0);
}
};
se faccio così mi compare: Codice:
[y/n]?: [y/n]?: _
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2451
|
A me funziona, uso Dev-C++.
Anche su Visual C++ 2005 compila bene...
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
|
|
|
|
|
#6 |
|
Senior Member
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: 8896
|
semplicemente devi mettere:
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 |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
comunque grazie
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#8 |
|
Senior Member
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: 8896
|
prima di ogni scanf se non vuoi modificare la funzione.
~§~ 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 |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
ho incollato "fflush (stdin);" davanti a tutti gli scanf del codice, ma la situazione non cambia
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
fflush(stdin) è non standard, è una estensione Borland mi sembra ( o giù di lì). fflush funziona solo con STDOUT in maniera determinata. Per eliminare il carattere di newline ci vuole un altro metodo : while ( getchar() != '\n') {} Comunque a me quel programma va in Seg Fault inspiegabilmente Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
uffa... non capisco una virgola di ciò che hai scritto...
c'è modo di risolvere o no? senza cambiare da if a while intendo...
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
La funzione scanf non è la migliore per prendere in input un solo carattere e ora ti spiego il perchè . Quando scanf legge il carattere che hai messo in input essa lo legge dallo standard input, che è un array di caratteri direttamente collegato alla tastiera. Tutto quello che premi sulla tastiera viene automaticamente memorizzato nello standard input finchè non arriva qualcosa che legge dallo standard input svuotandolo. Quando tu immetti il tuo carattere per la scanf non ti limiti a premere il tuo carattere ('y' o 'n') nel tuo caso, ma premi anche il tasto invio, che equivale al carattere di newline '\n' . scanf si limita solo a leggere dallo standard input il carattere che hai immesso e lo toglie dallo standard input memorizzandolo nella variabile che gli hai specificato. Il problema è che nello standard input rimane il carattere '\n' che viene letto da scanf e interpretato come terminazione dell' immissione , ma che non viene rimosso dallo standard input rimanendo "intrappolato". Se viene successivamente eseguita una nuova chiamata di scanf la funzione leggerà dallo standard input il primo carattere che trova e ciò che trova è proprio il carattere di newline , che memorizza nella variabile indicata in scanf , però poi interpreta anche il carattere come comando di terminazione dell' immissione facendo così saltare quella scanf . Per evitare il problema devi rimuovere il carattere intrappolato nello standard input . Per farlo puoi usare il comando :" while (getchar() != '\n') continue;" Quello che fa questo comando è continuare a chiamare la funzione getchar() ,che altro non fa che leggere un carattere dallo standard input , finchè non trova un carattere di newline, in modo da rimuoverlo dallo standard input. Non usare fflush(stdin) per fare ciò, con alcuni compilatori funziona, ma non essendo specificato nello standard C il comportamento di fflush() nel caso gli venga fornito come argomento "stdin" su molti altri da un risultato indefinito (se usi Dev-C++ che è un derivato di gcc, o gcc puro ti posso dire già in partenza che non funziona) Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#13 |
|
Senior Member
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: 8896
|
codice che non da nessun problema:
Codice:
int main(void)
{
char q;
float var, var2;
fflush (stdin);
printf("[y/n]?");
scanf("%c", &q);
if(q == 'y') {
printf("lol:\n");
fflush (stdin);
scanf("%f", &var);
}
else {
printf("[y/n]?");
fflush (stdin);
scanf("%c", &q);
if(q == 'y') {
printf("lol2");
fflush (stdin);
scanf("%f", &var2);
}
else {
printf("doh");
}
}
system ("PAUSE");
}
3) è standard da quanto ne so e da quanto ho visto in interdet ~§~ 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 |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Non è standard tant'è che sulla mia macchina linux non funziona . Cento per cento assicurato.Ma forse mi sono spiegato male. Io per "non-standard"non intendo che la funzione fflush() non faccia parte dello standard C (cosa non vera) , ma per non standard intendo che il suo uso in questo caso è sbagliato perchè non è portabile (su certi compilatori funziona su certi altri no) Ci ho sbattutto la testa in passato per 2 giorni cercando di capire perchè "fflush(stdin)" non andasse fflush serve a flushare dei buffer di output, non i buffer di input (come "stdin"). http://faq.cprogramming.com/cgi-bin/...&id=1043284351 Se vuoi qualcosa di pienamente portabile e sicuro che funzionerà sulla maggiorparte dei sistemi devi usare il metodo "while+getchar()". Ciao
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 18-10-2005 alle 19:43. |
|
|
|
|
|
|
#15 | |
|
Senior Member
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: 8896
|
Quote:
~§~ 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 |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Questa prova la feci 1 anno e mezzo fa (da allora uso sempre e solo il metordo "while+getchar()" ) e allora non funzionava. Oggi non so se nelle glibc questa funzionalità è stata aggiunta ( a mio parere comunque è una cosa sbagliata supportare una funzionalità aggiuntiva del genere che rischia di minare la intercompilabilità del codice ) , dovrei controllare, magari provo a dare una compilata al codice che hai postato. Comunque anche se è supportato su GLIBC (forse) non è detto che lo sia anche su altri sistemi , come BSD Libc o Solaris, quindi in definitiva reputo "while+getchar()" sempre e comunque una scelta migliore. Ciao! EDIT: Come previsto sul mio sistema non funziona : Codice:
melchior@melchior:~$ ./fenom [y/n]?n [y/n]?dohmelchior@melchior:~$
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 18-10-2005 alle 19:59. |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
io per pulire lo stream STDIN uso la fpurge(stdin)
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Codice:
FPURGE(3) Linux Programmer's Manual FPURGE(3)
NAME
fpurge, __fpurge - purge a stream
....
CONFORMING TO
These functions are nonstandard and not portable. The function
fpurge() was introduced in BSD 4.4 and is not available under Linux.
The function __fpurge() was introduced in Solaris, and is present in
glibc 2.1.95 and later.
NOTES
Usually it is a mistake to want to discard input buffers.
.....
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
piuttosto sto provando Gentoo (sto installando la Stage1)
|
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Comunque Visual C lo usano sempre in meno nelle UNI. Si sta diffondendo l'utilizzo di GCC o derivati a uso didattico. Da me usano DevC++ Ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:06.



















