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

    C++

    Salve,
    sono uno studente alle prime armi con c++

    ho un problema riguardante un programma di memorizzazione dati di una videoteca:

    quando inserisco il titolo (cin>>)o il nome della regia se e' presente uno spazio " " dopo aver premuto enter.
    il programma conclude. Qualcuno mi sa spiegare perche' e come risolvere il problema?

    Grazie




    #include <iostream>
    #include <string>
    using namespace std;

    const short MAXTITEL=30; //maximale länge titel
    const short MAXREGIE=20; //maximale länge regie
    const short MAXVIDEO=3; //maximale länge video

    struct datum //definisco la struttura del giorno
    {
    int tag;
    int monat;
    int jahr;
    };
    struct video //definisco la struttura del video
    {
    int id;
    char titel[MAXTITEL];
    char regie[MAXREGIE];
    datum edatum; //con edatum richiamo la struttura datum
    int preise;
    }videotot[MAXVIDEO]; //definisco un array secondo il numero massimo di video

    void videoerfassen(video &movie) //funzione con variabile video e indirizzo &movie
    {
    cout<< "neue video erfassen"<<endl;
    cout<< "id eingeben"<<endl;
    cin>> movie.id; //scrivo il testo nell'integer id nell'indirizzo movie
    cout<< "titel eingeben"<<endl; //all'interno della struttura video nella casella 0
    cin>> movie.titel; //dell'array videotot
    cout<< "regie eingeben"<<endl;
    cin>> movie.regie;
    cout<< "datum eingeben:TT/MM/JJ"<<endl;
    cout<<"TT:";
    cin>> movie.edatum.tag;
    cout<<"MM:";
    cin>> movie.edatum.monat;
    cout<<"jjjj:";
    cin>> movie.edatum.jahr;
    cout<< "preise eingeben"<<endl;
    cin>> movie.preise;
    return;
    }
    void videoanzeigen(video ciao) //definisco la funzione videoanzeigen
    {
    cout<<"*****************************"<<endl;
    cout<< "id:" << ciao.id<<endl; //stampo l'integer id presente nella struttura
    cout<< "titel:" << ciao.titel<<endl; //video nell'array videotot
    cout<< "regie:" << ciao.regie<<endl;
    cout<< "datum:" << ciao.edatum.tag<<"/";
    cout<< ciao.edatum.monat<<"/";
    cout<< ciao.edatum.jahr<<endl;
    cout<< "preise:"<<ciao.preise<<endl;
    }
    int main()
    {
    int i,s,j=0;
    for (i=0;i<MAXVIDEO;i++)
    {
    videoerfassen(videotot[i]);
    if(videotot[i].edatum.jahr>1988)
    {
    j++;
    }

    }
    for (s=0;s<MAXVIDEO;s++)
    {
    videoanzeigen(videotot[s]);
    cout<<endl;
    }
    cout<<"n."<<j<<" video nach jahr 1988";
    }

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E' normale.
    cin estrae caratteri fino al primo spazio, lasciando gli altri nel buffer interno.
    Usa std::string per le stringhe e la funzione getline.

    codice:
    struct video //definisco la struttura del video
    {
    int id;
    std::string titel;
    std::string regie;
    datum edatum; //con edatum richiamo la struttura datum
    int preise;
    }videotot[MAXVIDEO]; //definisco un array secondo il numero massimo di video
    
    ... 
    
    cout<< "titel eingeben"<<endl; //all'interno della struttura video nella casella 0
    std::getline(cin, movie.titel); //dell'array videotot
    cout<< "regie eingeben"<<endl;
    std::getline(cin, movie.regie);
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    grazie mille sodan,


    alla prima prova non ha funzionato, poi ho notato che questa funzione ha bisogno di un simbolo che afferma che la stringa e' conclusa (io ho inserito un punto), e' possibile anche solo con il tasto enter?

    il nostro professore non ci ha insegnato questo metodo, spero che venga comunque accettato nei test.
    elimina molte complicazioni e se esiste perche' non usarlo mah...

    Ciao!

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Strano. Per default, la getline estrae caratteri finché non trova il '\n'.

    Per il resto, non avevi specificato un "professore". Meglio se chiedi a lui se puoi usare questo metodo. In caso non lo accetti, occorre procedere in un altro modo.
    (Praticamente scriversi una propria getline()).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    si, credo che scrivere una propria getline sia la soluzione migliore,
    ma come? mi potresti dare una consiglio?

    grazie.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Più o meno la getline legge carattere per carattere dallo stream di input e se trova il newline, lo toglie ed esce.
    Ad esempio:
    codice:
    	char c[32];
    	for (int i=0; i < 32; i++) {
    		cin.get(c[i]);
    		if (c[i]=='\n') {
    			c[i]=0;
    			break;
    		}
    	}
    In alternativa c'è anche il metodo getline associato allo stream di output (di certo più sicuro che usare l'operatore di estrazione >> su un char array).

    codice:
    char c[32];
    cin.getline(c,32);
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    grazie mille,

    molto gentile ad aiutarmi.


    buona serata, ciao.


    David.

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