Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Conflitto tra funzione gets() e le istruzioni if & switch!!

    Salve a tutti,
    allora ho scritto questo programmino che simula la gestione di un database. Il problema sorge quando cerco di inserire un nuovo record... Usando la funzione gets(), chiendo in input una stringa di max 20 char. Però quando chiamo la funzione inserisci_record() dal menu', il programma da già per acquisita la stringa nome e chiede solamente la stringa cognome (ho lasciato dei commenti lungo il codice che spiegano vari tentavi che ho fatto per risolvere il problema):

    Codice PHP:
    #include "stdafx.h" //necessaria per la versione Visual C++
    #include <iostream>
    #include <cstdio>
    using namespace std;

    #define MAX 10

    struct database {
           
    char nome[20];
           
    char cognome[20];
    };

    int elements 0;
    database tab[MAX];

    char menu(); /*ho provato a restituire un int ma il programma non funziona lo stesso*/
    bool database_emply();
    bool database_free();
    void inserisci_record();
    void elimina_record();
    void stampa_tab();

    void main() {    
        
    char scelta;    
        do {
            
    scelta menu();
            switch(
    scelta) {
                case 
    '0':
                    exit(-
    1);
                case 
    '1':
                    
    inserisci_record();
                    break;
                case 
    '2':
                    
    elimina_record();
                    break;
                case 
    '3':
                    
    stampa_tab();
                    break;
            }
            
    //if(scelta == '1') inserisci_record(); /*questo è un tentativo di usare al posto dell'istruzione di controllo switch, la funzione if. Il risultato è lo stesso...*/
        
    } while(1);
    }

    char menu() {
         
    char scelta;

         
    cout << "\n";
         
    cout << " Menu':\n";
         
    cout << "\n";
         
    cout << " 1. Inserisci Record;\n";
         
    cout << " 2. Elimina Record;\n";
         
    cout << " 3. Stampa Database;\n";
         
    cout << " 0. Esci.\n";

         
    cout << "\n";
         
    cout << " Scelta: ";
         
    cin >> scelta;

         return 
    scelta;
    }

    bool database_emply() {
         return 
    elements == MAX;
    }

    bool database_free() {
         return 
    elements == 0;
    }

    void inserisci_record() {
         if(
    database_emply()) {
            
    cout << "\n";
            
    cout << " Database Emply!!\n";
            return;
         }
         
    cout << "\n";
         
    cout << " Nome: "gets(tab[elements].nome);
         
    cout << " Cognome: "gets(tab[elements].cognome);
         
    elements++;
    }

    void elimina_record() {
         if(
    database_free()) {
            
    cout << "\n";
            
    cout << " Database Free!!\n";
            return;
         }
         
    elements--;
    }

    void stampa_tab() {
         for(
    int i 0elementsi++) {
                 
    cout << "\n";
                 
    cout << " " << i+<< ". ";
                 
    cout << tab[i].nome << " " << tab[i].cognome;
                 
    cout << "\n";
         }

    Il programma l'ho scritto prima con Il Dev-C++, poi lo trasportato sul Visual C++. Con entrambi i compilatori il programma si comporta come detto prima. Sono sicuro che il problema stia nelle funzioni di controllo if & switch, visto che il programma scritto così funziona:

    Codice PHP:
    #include "stdafx.h" 
    #include <iostream>
    #include <cstdio>
    using namespace std;

    #define MAX 10

    struct database {
           
    char nome[20];
           
    char cognome[20];
    };

    int elements 0;
    database tab[MAX];

    bool database_emply();
    bool database_free();
    void inserisci_record();
    void stampa_tab();

    void main() {    
         
    inserisci_record(); 
         
    stampa_tab(); 
         
    getchar();
    }

    bool database_emply() {
         return 
    elements == MAX;
    }

    bool database_free() {
         return 
    elements == 0;
    }

    void inserisci_record() {
         if(
    database_emply()) {
            
    cout << "\n";
            
    cout << " Database Emply!!\n";
            return;
         }
         
    cout << "\n";
         
    cout << " Nome: "gets(tab[elements].nome);
         
    cout << " Cognome: "gets(tab[elements].cognome);
         
    elements++;
    }

    void stampa_tab() {
         for(
    int i 0elementsi++) {
                 
    cout << "\n";
                 
    cout << " " << i+<< ". ";
                 
    cout << tab[i].nome << " " << tab[i].cognome;
                 
    cout << "\n";
         }


  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Nella funzione menu, alla fine prima del return ...

    codice:
         while(!getc(stdin));
    
         return scelta;

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Il linguaggio va indicato anche nel titolo.

    Lo aggiungo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Nella funzione menu, alla fine prima del return ...

    while(!getc(stdin));
    return scelta;
    Grazie... ora funziona anche se non ho ben capito perchè. Ma perchè il problema non si presenta se invece di chiedere in input una stringa con la funzione gets(), chiedo per esempio un int o un char con la cin?!

    Il linguaggio va indicato anche nel titolo.
    Scusa...

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 © 2026 vBulletin Solutions, Inc. All rights reserved.