2013-01-12 4 views
6

L'affermazione cout in questo ciclo for:C++ cout stesso sovrascrivendo mentre nel ciclo for

for (vector<Student>::iterator qw = students.begin(); qw != students.end(); ++qw){ 
    Student a = *qw; 
    name = a.getName(); 
    regno = a.getRegNo(); 
    std::cout << "Name: "<< name << " Reg Number: " << regno << endl; 
} 

è la creazione di un comportamento strano, quello che il cout deve stampare è qualcosa di simile:

Nome: Mike Sanderson Reg numero: 10101

tuttavia che effettivamente stampa fuori è:

Reg Numero: 10101on

Sembrerebbe a me che dopo la seconda parte della dichiarazione cout si sta tornando al punto di partenza della linea e sovrascrivere in sé, ma perché? Spero che voi ragazzi potete aiutarmi e se avete bisogno di maggiori informazioni fatemelo sapere!

+2

'Studente' non dovrebbe avere un puntatore al suo interno a cui è allocata la memoria dinamica senza seguire la regola del tre, vero? – chris

+1

Che tipo è 'nome'? Cosa restituisce 'a.getName()'? (Metti un breakpoint di debug subito prima della riga 'cout' e guarda cosa c'è in' name' e 'regno'.) –

+0

@DavidSchwartz yes Dovrei averlo messo, scusa, il nome è un ritorno std :: string e a.getName() una std.string a –

risposta

15

Questo è ciò che fa il carattere di ritorno a capo (ovvero, \r in una stringa letterale). Presumo che la stringa name abbia un \r alla fine. Dovrai capire come è arrivato e rimuoverlo.

Suppongo che forse si leggano i nomi da un file e che il file sia stato creato su Windows, che termina le righe con \r\n per impostazione predefinita. C++ di solito gestirà la conversione tra le terminazioni di linea per te durante la lettura da un file di testo, ma se stai leggendo il file come file binario e usando \n come delimitatore, avrai questo problema. Lo \r verrà letto come se fosse parte della linea.

+0

Stavo pensando che fosse lì dalla memoria casuale come conseguenza del mio commento: p – chris

+0

Grazie dovrei dare un'occhiata, non dovrebbe "fare" ma cose più strane sono successe –

+0

@ZacPowell, Pubblicare la tua classe sarebbe un buon inizio. – chris