PDA

Visualizza la versione completa : [C] problema con menu


frankj
08-10-2014, 17:01
Salve,
mi scuso in anticipo se la sezione è sbagliata o non indico tutte le info necessarie.
Comunque sono sotto ubuntu e compilo il seguente programma con: gcc -o menu menu.c

// menu con fgets
#include <stdio.h>
#define fflush(stdin) while ((getchar()) != '\n')
int main(){

printf("'aggiungi' \n");
printf("'cerca' \n");
printf("\n ---------------------------------\n");
printf("'exit' \n");
printf("\nDigita una opzione: ");


char agg[]="aggiungi\n";
char cerca[]="cerca\n";
char exit[]="exit\n";
int count=3;
//char spazio[]="/n";
char temp[11];




fgets(temp,11,stdin);
fflush(stdin);



while (count > 1){

if(strcmp(temp,agg)==0) {printf("1\n");return 1;}
if(strcmp(temp,cerca)==0){ printf("2\n");return 2;}
if(strcmp(temp,exit)==0) {printf ("3\n");return 3;}
count--;

printf("errore immissione hai a disposizione ancora %d tentativi,digita una opzione:",count);


fgets(temp,11,stdin);
fflush(stdin);


}
}

il programma funziona, il problema sta nel fatto che quando immetto da tastiera una opzione valida
devo premere una ulteriore volta "invio", questo è sicuramente dato da come è stata implementata la "fflush" ma se viene omessa, nel caso in cui digito una stringa troppo grande da tastiera l' stdin rimane sporco e il programma termina (probabilmente per le successiva fgets legge quello che è rimasto nello stdin )
NB
non posso usare la scanf poiché a quanto ho capito è vulnerabile

Vi ringrazio in anticipo, so che può sembrare una cosa stupida da fare ma veramente mi sta creando problemi:messner:

oregon
08-10-2014, 19:38
Dopo la fgets prova con

if(temp[strlen(temp)-1] != '\n') while(getchar() != '\n');

Scara95
08-10-2014, 19:39
Per prima cosa ti consiglio di non usare nomi già assegnati ad altre funzioni di libreria. In ogni caso controlla se l'ultimo carattere nella stringa (strlen(variabile)-1) è '\n'. Se così è hai letto l'intera riga, altrimenti te ne manca un pezzo (nel qual caso puoi pulire il buffer).

frankj
08-10-2014, 21:55
ok :) grazie mille problema risolto!

frankj
09-10-2014, 00:27
ops.....ho parlato troppo presto.............nel caso del codice precedente ho risolto, ma se voglio usare la fgets o la fgets+altra funzione
al posto della scanf, come dovrei fare?????.. mi spiego meglio adesso devo gestire una serie di input da tastiera che vengono salvate in un campo di una struct e poi inviate a un server, es:


while(scanf("%s", record.cognome) == -1){
if(errno != EINTR){
printf("\nErrore scanf\n");
chiusuraClient();
}
}
write(sock, record.cognome, COGNOME);


ho provato con questa soluzione:

printf("\nInserisci cognome: ");fflush(stdout);
fgets(record.cognome,COGNOME,stdin);
if(record.cognome[COGNOME-1] != '\n') while(getchar() != '\n');


ma la cosa nn funziona:afraid:......da quello che ho capito a parte il fatto che la scanf prende un testo formattato la fgets dovrebbe ricevere in più solo lo '\n', però c'è qulcosa che mi sfugge

oregon
09-10-2014, 00:41
In questa if

if(record.cognome[COGNOME-1] != '\n') while(getchar() != '\n');

perchè non hai usato la strlen come nell'esempio che ti ho mostrato?

frankj
09-10-2014, 14:37
In questa if

if(record.cognome[COGNOME-1] != '\n') while(getchar() != '\n');

perchè non hai usato la strlen come nell'esempio che ti ho mostrato?

perchè sono un pò rimba :facepalm: .....cmq intanto ti rigrazio....inoltre dal lato server avevo il problema che quello che mandavo veniva mal stampato su di un file....così mi sembra di aver risolto:


printf("\nInserisci il cognome: ");fflush(stdout);
fgets(record.cognome,NOME,stdin);
if(record.cognome[strlen(record.cognome)-1] != '\n') while(getchar() != '\n');
if(record.cognome[strlen(record.cognome)-1] = '\n') record.cognome[strlen(record.cognome)-1] = '\0';


probabilmete mi prendeva uno '\n' da qualche parte... ora mi chiedevo che tipo di controlli (sui segnali) faccio sulla fgets.....una cosa del genere può andare??



printf("\nInserisci il cognome: ");fflush(stdout);
while( fgets(record.cognome,NOME,stdin)==NULL){
if(errno != EINTR){
perror("\nErrore fgets, errore tipo:");
chiusuraClient();
}
}
if(record.cognome[strlen(record.cognome)-1] != '\n') while(getchar() != '\n');
if(record.cognome[strlen(record.cognome)-1] = '\n') record.cognome[strlen(record.cognome)-1] = '\0';

Loading