Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C] problema con menu

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    6

    [C] problema con menu

    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
    codice:
    // 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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dopo la fgets prova con

    if(temp[strlen(temp)-1] != '\n') while(getchar() != '\n');
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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).
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    6
    ok grazie mille problema risolto!

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    6
    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:

    codice:
    while(scanf("%s", record.cognome) == -1){
                                if(errno != EINTR){
                                        printf("\nErrore scanf\n");
                                        chiusuraClient();
                                }
                        }
    write(sock, record.cognome, COGNOME);
    ho provato con questa soluzione:
    codice:
     printf("\nInserisci cognome: ");fflush(stdout);
                        fgets(record.cognome,COGNOME,stdin);
                        if(record.cognome[COGNOME-1] != '\n') while(getchar() != '\n');
    ma la cosa nn funziona......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

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    6
    Quote Originariamente inviata da oregon Visualizza il messaggio
    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 .....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:
    codice:
    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??

    codice:
    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';

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.