View Full Version : [C] 2 domande
negator136
17-10-2005, 18:31
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 :)
Per la prima puoi fare un return 0; o un exit(0);
Per la seconda, nel confronto dei caratteri devi usare gli apici singoli
if(var=='y') ...
Ciao
negator136
17-10-2005, 18:46
Per la prima puoi fare un return 0; o un exit(0);
Per la seconda, nel confronto dei caratteri devi usare gli apici singoli
if(var=='y') ...
Ciao
ho provato anche quella!
aspè che ci riprovo... avrò sbagliato qualcosa...
grazie mille :)
negator136
17-10-2005, 18:59
ho provato anche quella!
aspè che ci riprovo... avrò sbagliato qualcosa...
grazie mille :)
doh... funziona... ma non del tutto... cioè... ci devo aver sparato dentro qualche errore :(
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);
}
};
dov'è l'errore?
se faccio così mi compare: [y/n]?: [y/n]?: _
dove "_" è l'unico scanf che mi prende... :( :muro:
A me funziona, uso Dev-C++.
Anche su Visual C++ 2005 compila bene...
Fenomeno85
17-10-2005, 19:31
semplicemente devi mettere:
fflush (stdin)
~§~ Sempre E Solo Lei ~§~
negator136
17-10-2005, 19:38
semplicemente devi mettere:
fflush (stdin)
~§~ Sempre E Solo Lei ~§~
ehm.. dove? :fagiano:
comunque grazie :)
Fenomeno85
17-10-2005, 19:42
prima di ogni scanf se non vuoi modificare la funzione.
~§~ Sempre E Solo Lei ~§~
negator136
17-10-2005, 19:48
prima di ogni scanf se non vuoi modificare la funzione.
~§~ Sempre E Solo Lei ~§~
non credo di aver capito...
ho incollato "fflush (stdin);" davanti a tutti gli scanf del codice, ma la situazione non cambia :(
AnonimoVeneziano
17-10-2005, 20:23
semplicemente devi mettere:
fflush (stdin)
~§~ Sempre E Solo Lei ~§~
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 :mbe:
Ciao
negator136
17-10-2005, 20:33
uffa... non capisco una virgola di ciò che hai scritto...
c'è modo di risolvere o no? :mbe:
senza cambiare da if a while intendo...
:(
AnonimoVeneziano
17-10-2005, 20:53
uffa... non capisco una virgola di ciò che hai scritto...
c'è modo di risolvere o no? :mbe:
senza cambiare da if a while intendo...
:(
Purtroppo a quanto ho capito (anche se non riesco a riprodurlo perchè il tuo programma mi crasha sul mio sistema e non riesco a capire il perchè) hai il tipico problema del carattere di "newline" intrappolato nel buffer di input.
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
Fenomeno85
18-10-2005, 18:39
codice che non da nessun problema:
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");
}
2) anonimo guarda che funziona anche sotto devc++ utilizzando solo libreria stdio.h
3) è standard da quanto ne so e da quanto ho visto in interdet
~§~ Sempre E Solo Lei ~§~
AnonimoVeneziano
18-10-2005, 19:40
codice che non da nessun problema:
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");
}
2) anonimo guarda che funziona anche sotto devc++ utilizzando solo libreria stdio.h
3) è standard da quanto ne so e da quanto ho visto in interdet
~§~ Sempre E Solo Lei ~§~
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/smartfaq.cgi?answer=1052863818&id=1043284351
Se vuoi qualcosa di pienamente portabile e sicuro che funzionerà sulla maggiorparte dei sistemi devi usare il metodo "while+getchar()".
Ciao
Fenomeno85
18-10-2005, 19:47
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/smartfaq.cgi?answer=1052863818&id=1043284351
Se vuoi qualcosa di pienamente portabile e sicuro che funzionerà sulla maggiorparte dei sistemi devi usare il metodo "while+getchar()".
Ciao
strano mi sembrava di averlo usato tranquillamente anche sotto linux
~§~ Sempre E Solo Lei ~§~
AnonimoVeneziano
18-10-2005, 19:56
strano mi sembrava di averlo usato tranquillamente anche sotto linux
~§~ Sempre E Solo Lei ~§~
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 :
melchior@melchior:~$ ./fenom
[y/n]?n
[y/n]?dohmelchior@melchior:~$
io per pulire lo stream STDIN uso la fpurge(stdin) ;) e funge :p
AnonimoVeneziano
18-10-2005, 21:06
io per pulire lo stream STDIN uso la fpurge(stdin) ;) e funge :p
fpurge() proprio non è standard , però in questo caso nell' altro senso ( cioè c'è su linux/BSD ma non su altri sistemi.) Infatti da "man fpurge" :
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.
.....
fpurge() proprio non è standard , però in questo caso nell' altro senso ( cioè c'è su linux/BSD ma non su altri sistemi.) Infatti da "man fpurge" :
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.
.....
infatti :sofico: è un po' che uso solo GCC ;) su Linux Visual C non lo uso da un pochetto :( ma all'UNI usiamo GCC ;) quindi mi sembra doveroso adattarmi...
piuttosto sto provando Gentoo (sto installando la Stage1) :read:
AnonimoVeneziano
18-10-2005, 21:13
piuttosto sto provando Gentoo (sto installando la Stage1) :read:
Scandalo, tradimento!!!! :eek: :eek: Bannato dal clan debian :sofico:
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
Scandalo, tradimento!!!! :eek: :eek: Bannato dal clan debian :sofico:
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
DevCpp :Puke: non lo sopporto...l'ho dovuto usare fin troppo per le Olimpiadi di Informarica :(
per quanto riguarda Gentoo :Prrr: la usa anche PiloZ ;) e io sto installando su macchina virtuale :sofico:
repne scasb
18-10-2005, 21:22
Senza pulire alcunche':
#include <stdio.h>
void main(void)
{
char q;
float var,var2;
printf("[y/n]?");
scanf("%2c",&q);
if(q=='y')
{
printf("lol: ");
scanf("%f",&var);
}
else
{
printf("[y/n]?");
scanf("%2c",&q);
if(q=='y')
{
printf("lol2: ");
scanf("%f",&var2);
}
else
printf("doh");
}
}
Chissa' se questo codice e' portabile.
AnonimoVeneziano
18-10-2005, 21:24
Senza pulire alcunche':
#include <stdio.h>
void main(void)
{
char q;
float var,var2;
printf("[y/n]?");
scanf("%2c",&q);
if(q=='y')
{
printf("lol: ");
scanf("%f",&var);
}
else
{
printf("[y/n]?");
scanf("%2c",&q);
if(q=='y')
{
printf("lol2: ");
scanf("%f",&var2);
}
else
printf("doh");
}
}
Chissa' se questo codice e' portabile.
no comment
:asd:
AnonimoVeneziano
18-10-2005, 21:25
DevCpp :Puke: non lo sopporto...l'ho dovuto usare fin troppo per le Olimpiadi di Informarica :(
per quanto riguarda Gentoo :Prrr: la usa anche PiloZ ;) e io sto installando su macchina virtuale :sofico:
Ammazza, su macchina virtuale?? Ma non ti passa + a compilarla :D
Ciao
Senza pulire alcunche':
#include <stdio.h>
void main(void)
{
char q;
float var,var2;
printf("[y/n]?");
scanf("%2c",&q);
if(q=='y')
{
printf("lol: ");
scanf("%f",&var);
}
else
{
printf("[y/n]?");
scanf("%2c",&q);
if(q=='y')
{
printf("lol2: ");
scanf("%f",&var2);
}
else
printf("doh");
}
}
Chissa' se questo codice e' portabile.
ad occhio sembra di si :) bella l'idea di bypassare l'acquisizione dello \n con l'acquisizione di 2 char ;)
quanto tempo che non ti si vedeva qui :eek:
Ammazza, su macchina virtuale?? Ma non ti passa + a compilarla :D
Ciao
già... :muro:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.