PDA

View Full Version : [C-Unix] Non capisco cosa è che non va...


stella_650
10-01-2007, 16:38
Ciao a tutti!Sto praticamente :muro: per cercare di capire perchè , compilando ed eseguendo sotto unix il seguente codice( che è ovviamente la parte di un programmino), ho dei problemi con la gestione dell'input..Riporto la parte del codice e poi mi spiego meglio:

char termord='c';
while(termord == 'c'){
fflush(stdin);
printf("Inserire codice portata.. ");
scanf("%s",&c.cod_piet);
printf("%s",c.cod_piet);
printf("\n\n\nInserire numero di portate per questa pietanza.. ");
scanf("%d",&c.n_port);
printf("\n\n\nPremere 'q'(quit) per terminare l'ordinazione,\noppure 'c' per continuare\n ");
scanf("%c",&termord); }

Arrivata alla parte colorata, è il problema: cioè dopo aver letto il numero di portate, vorrei poter effettuare la scelta tra il carattere 'c' ed il carattere 'q', invece quella scanf non viene proprio eseguita!!!Cioè come è possibile che non possa digitare quel carattere?

Fatemi sapere qualcosa, perchè mi sto incrippando:)
(io uso quella scanf anche prima! e non mi spiego perchè quella non piaccia al compilatore...)

Grazie raga'

andbin
10-01-2007, 17:30
Arrivata alla parte colorata, è il problema: cioè dopo aver letto il numero di portate, vorrei poter effettuare la scelta tra il carattere 'c' ed il carattere 'q', invece quella scanf non viene proprio eseguita!!!Cioè come è possibile che non possa digitare quel carattere?

Fatemi sapere qualcosa, perchè mi sto incrippando:)
(io uso quella scanf anche prima! e non mi spiego perchè quella non piaccia al compilatore...)C'è una cosa che sicuramente non sai ... e che rende la scanf una stramaledetta ciofeca di funzione: la scanf si ferma al primo carattere che non corrisponde a quanto richiesto ma lo lascia nel buffer.
L'ultima scanf, quella che hai messo in verde, non chiede nulla in input perché "riceve" il \n lasciato nel buffer dalla precedente scanf.

Io in questi casi consiglio sempre l'utilizzo di fgets+sscanf, anche se risulta un pochino più lungo.

Altrimenti puoi mettere:
while (getchar () != '\n');

oppure

scanf("%d%*c",&c.n_port);

TuLKaS85
10-01-2007, 17:50
ciao :) altrimenti prova a mettere prima dell'ultima scanf un altro flush(stdin)

andbin
10-01-2007, 18:10
Faccio notare che la fflush() è fatta per operare su stream di output, non di input. Il comportamento di fflush() con stream di input non è definito, quindi fflush(stdin) è da evitare.

nico88desmo
10-01-2007, 18:20
al posto di usare la scanf potresti usare questa funzione che simula la getch() di windows e praticamente prende un carattere alla volta senza aspettare l'invio;


#include <termios.h>
#define STDIN_FILENO 0
int readkey();
int main()
{
int a;
a=readkey();
printf ("Premuto %d\n",a);
return 0;
}
int readkey()
{
int c;
struct termios tty, otty;
tcgetattr(STDIN_FILENO, &otty);
tty = otty;
tty.c_lflag &= ~(ECHO | ECHOK | ICANON);
tty.c_cc[VTIME] = 1;
tcsetattr(STDIN_FILENO, TCSANOW, &tty);
c = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &otty);
return (c);
}

beppegrillo
10-01-2007, 18:35
Faccio notare che la fflush() è fatta per operare su stream di output, non di input. Il comportamento di fflush() con stream di input non è definito, quindi fflush(stdin) è da evitare.
O fpurge() che mi pare la si possa usare anche in caso di input.

stella_650
10-01-2007, 19:29
risolto con getchar, grazie mille:)
Buona serata a tutti!!!

andbin
10-01-2007, 21:15
O fpurge() che mi pare la si possa usare anche in caso di input.Non è standard .... il VC++ ad esempio non ce l'ha. Su Linux c'è e da quanto ho letto opera anche su stream di input.