2013-01-12 65 views
6

Oświadczenie cout w tej pętli:C++ cout nadpisywania się natomiast w pętli 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; 
} 

tworzy jakieś dziwne zachowanie, co cout należy wydrukować coś takiego:

Nazwa: Ilość Mike Sanderson Reg: 10101

jednak którym faktycznie wypisuje go:

Numer rejestracyjny: 10101on

Wydaje mi się, że po drugiej części zestawienia cout jest powrót do początku linii i nadpisanie się, ale dlaczego? Mam nadzieję, że możesz mi pomóc, a jeśli potrzebujesz więcej informacji, daj mi znać!

+2

"Student" nie miałby w nim wskaźnika, który jest przydzielany dynamiczną pamięcią, nie przestrzegając reguły trzech, czyż nie? – chris

+1

Jakiego typu jest 'name'? Co zwraca 'a.getName()'? (Umieść punkt przerwania debugowania tuż przed linią 'cout' i zobacz, co jest w' name' i 'regno'.) –

+0

@DavidSchwartz tak Powinienem był napisać to przepraszam, nazwa to std :: string i a.getName() zwraca a std.string do –

Odpowiedz

15

Oto, co robi znak powrotu karetki (czyli \r w ciągu literowym). Zakładam, że ciąg name ma na końcu końcówkę \r. Musisz dowiedzieć się, jak to się stało i usunąć.

Zgaduję, że prawdopodobnie czytasz nazwy z pliku, a ten plik został utworzony w systemie Windows, który domyślnie kończy się liniami z \r\n. C++ zwykle przetwarza konwersję między wierszami linii podczas czytania z pliku tekstowego, ale jeśli czytasz plik jako plik binarny i używasz separatora jako \n, będziesz miał ten problem. \r zostanie odczytany tak, jakby był częścią linii.

+0

Myślałem, że był tam z losowej pamięci w wyniku mojego komentarza: p – chris

+0

Dzięki będę musiał spojrzeć, to "nie powinienem" robić, ale dziwniejsze rzeczy się zdarzyły –

+0

@ZacPowell, Delegowanie klasy byłoby dobry start. – chris