2013-01-12 8 views
6

このforループではcout文の中にいる間自体を上書きCOUT:C++ループ

名:COUTは、印刷すべきか

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; 
} 

は、いくつかの奇妙な振る舞いを作成して、このようなものです:マイク・サンダーソンREG数は:10101

しかしそれは実際にそれをプリントアウトした:

REG数:10101on

それは私には思われる、それは行の先頭に戻って、それ自体を上書きするが、なぜされCOUT文の第二部の後? 皆さん、私を助けてくれることを願っております。

+2

「スチューデント」は3つのルールに従わずにダイナミックメモリを割り当てられたポインタを持つことはありませんか? – chris

+1

'name'はどのような型ですか? 'a.getName()'は何を返しますか? ( 'cout'行の直前にデバッグブレークポイントを置き、' name'と 'regno'の内容を見てください) –

+0

@DavidSchwartzはい私はそれを入れておくべきです、名前はstd :: stringで、a.getName私が見て、それははずの」を持たなければならないのp –

答えて

15

これは(つまり、文字列リテラルで\rです)キャリッジリターン文字が何をするかです。私はnameの文字列は、それの末尾に\rがあると仮定します。どのようにそこに着いてそれを削除するかを理解する必要があります。

私は、おそらくあなたがファイルから名前を読んで、そのファイルは、デフォルトでは\r\nで行を終了Windowsの、上で作成されたことを推測しています。テキストファイルから読み込むときにC++は通常行末の変換を処理しますが、ファイルをバイナリファイルとして読み込み、\nを区切り文字として使用すると、この問題が発生します。 \rは、行の一部であるかのように読み込まれます。

+0

にstd.string良いスタートです。 – chris

+0

おかげで物事が –

+0

@ZacPowellが起こっていませんが、見知らぬ人、あなたのクラスを投稿すると、次のようになります。私は私のコメントの結果としてランダムメモリから、それがあったことを考えていた – chris