PDA

Visualizza la versione completa : [C] Acquisizione valori e operatore con getchar() ed eseguire espressione


franzSPECIAL
14-02-2011, 10:15
Salve a tutti.

Il mio intento era di creare un programma che prendesse in input:
1)due numeri;
2)l'operatore;
ed eseguisse l'operazione corrispondente.

Utilizzando la scanf per memorizzare l'operatore ho avuto dei problemi; utilizzando la getchar idem. In entrambi i casi infatti, il programma non attendeva l'inserimento da tastiera dell'operatore ma terminava l'esecuzione come se io avessi inserito un carattere non valido.
Perché? [So che non conviene utilizzare la scanf per prendere valori in input..ma vorrei comunque capirne il funzionamento].



#include<stdio.h>
int main(){
printf("type 2 numbers\n");
int a,b;
char car=' ';
scanf("%d %d ", &a, &b);
printf("Insert the operator\n");
while((car=='\n')|(car=='\t')|(car=='\n')|(car=' '))
car=getchar();
switch(car){
case '+': printf("a+b= %d",a+b); break;
case '-': printf("a-b= %d",a-b); break;
case '*': printf("a*b=%d",a*b); break;
case '/': printf("a:b=%d",a/b); break;
default : printf("the requested operation is not valid");
return -1; }
return 0; }


Grazie per l'aiuto!

jobv
14-02-2011, 10:23
Ciao,

forse il problema è dovuto a questo: tu scrivi 2 numeri e premi invio. La scanf legge i due numeri ma nello standard input resta ancora l'invio ('\n') che hai dato.
Dopo la scanf aggiungi "fflush(stdin)" così da ripulire il buffer di input.

p.s. nel while chredo che tu voglia fare un OR logico ( || ) non un OR bit a bit ( | ) come hai scritto

franzSPECIAL
14-02-2011, 10:56
Purtroppo non va neanche così:


#include<stdio.h>
int main(){
printf("type 2 numbers\n");
int a,b;
char car=' ';
scanf("%d %d", &a, &b);
fflush(stdin);
while((car=='\n')||(car=='\t')||(car=' ')){
printf("Insert the operator\n");
scanf("%c",&car); }
switch(car){
case '+': printf("a+b= %d",a+b); break;
case '-': printf("a-b= %d",a-b); break;
case '*': printf("a*b=%d",a*b); break;
case '/': printf("a:b=%d",a/b); break;
default : printf("the requested operation is not valid");
return -1; }
return 0; }

spero non sia un problema del mio compilatore, ma solo della mia testa!

jobv
14-02-2011, 11:11
e se sostituisci "fflush(stdin)" con "getchar()"?

jobv
14-02-2011, 11:18
ed anche un'altra cosa:


while( car!='+' && car!='-' && car!='/' && car!='*')

franzSPECIAL
14-02-2011, 11:47
Perfetto..ora funziona!
Abbiamo utilizzato getchar() come raccoglitore di immondizia..ottima idea :D

Grazie mille!

jobv
14-02-2011, 11:52
Pare che la funzione fflush non funzioni bene su Linux con stdin...ho trovato in giro che alcuni consigliano di usare:

scanf("%*s");
Ma spero che qualcuno del forum possa illuminarci :)

YuYevon
14-02-2011, 18:42
Non è un problema di Linux o di altri sistemi, semplicemente non c'è nessuna garanzia che fflush(stdin) faccia quello che ci si aspetta. Come descritto nello standard infatti:



If stream points to an output stream or an update stream in which the most recent
operation was not input, the fflush function causes any unwritten data for that stream
to be delivered to the host environment to be written to the file; otherwise, the behavior is
undefined.


l' "otherwise" ovviamente comprende anche il caso il cui il file stream sia lo stdin. Insomma la fflush() richiamata su stdin ha un comportamento indefinito ("undefined behavior"), ragione per la quale con alcuni compilatori può sortire l'effetto di rilasciare caratteri bufferizzati nello stream di input (di fatto similmente a quello che succede con quelli di output) mentre con altri può anche semplicemente non fare nulla. Per citare Peter van der Linden:



undefined — The behavior for something incorrect, on which the standard does not impose any requirements. Anything is allowed to happen, from nothing, to a warning message to program termination, to CPU meltdown, to launching nuclear missiles (assuming you have the correct hardware option installed).


quindi attenzione a non provocare guerre nucleari.

jobv
14-02-2011, 18:51
Grazie!

franzSPECIAL
15-02-2011, 12:31
:D :D :D :D Grande Peter!

Grazie a tutti!

Loading