PDA

View Full Version : [C++] Problema con il flusso di input "cin.getline()"


Spanaccio
26-12-2008, 15:38
Ciao a tutti!!E' da poco che mi diletto con il C++ e ho riscontrato un problema al seguente programma che ho fatto per catalogare vinili.Quando inserisco i dati con il cin.getline() mi fa saltare la voce"artista" della struttura...le altre 2 no.. perche????(ho dovuto usare il cin.getline per poter inserire anche gli spazi..per inserire nome e cognome al campo artista ecc) Ecco il programma:

#include<iostream>
using namespace std;

struct vinile
{
char artista[30];
char album[30];
int anno;
vinile* succ;
};

typedef vinile* lista;
void inserisci_in_testa(lista& inizio, vinile lp)
{
lista p=new vinile;
*p=lp;
p->succ=inizio;
inizio=p;
}
void stampa_lista(lista output)
{
lista p=output; // p e output sono sinonimi
while(p!=0)
{

cout<<output->artista<<'\n'<<p->album<<'\n'<<p->anno<<'\n'<<'\n';
p=p->succ;
}
}
int main()
{
char r;
vinile lp;
lista catalogo=0;

cout<<"CATALOGO VINILI\n";
do
{

cout<<endl<<"Digitare 't' per inserire in testa i dati dei vinili:\n";
cout<<"Digitare 'p' per stampare a video i dati inseriti:\n";
cout<<"Digitare 'e' per uscire...\n";

cin>>r;
switch(r)
{
case 't': cout<<"Inserisci l'artista:\n";cin.getline(lp.artista,30);
cout<<"Inserisci l'album:\n";cin.getline(lp.album,30 );
cout<<"Inserisci l'anno:\n";cin>>lp.anno;
inserisci_in_testa(catalogo,lp);
break;
case 'p': stampa_lista(catalogo);
break;
case 'e': break;
default: cout<<"ERRORE!!!L'operatore inserito e' errato!!\n";break;
}
}while(r != 'e');

system("pause");
}


Grazie a tutti in anticipo!!

cionci
27-12-2008, 10:38
Perché il cin lascia un carattere \n all'interno dello standard input. Di conseguenza la getline si ferma subito leggendo lo \n.

E' lo stesso identico problema che si presenta qui: http://www.hwupgrade.it/forum/showthread.php?t=1888798

Spanaccio
27-12-2008, 16:04
Grazie mille!Ho dichiarato un "char d" e ho risolto mettendo subito dopo lo \n un cin.get(d)... adesso funziona perfettamente!

cionci
27-12-2008, 16:20
Grazie mille!Ho dichiarato un "char d" e ho risolto mettendo subito dopo lo \n un cin.get(d)... adesso funziona perfettamente!
Prova ad inserire più lettere e a premere invio, continuerà a non funzionare.
Puoi svuotare lo stream così:
while(cin.get() != '\n');