2011-08-10 21 views
5

私はUbuntuでWindows用に開発されたプログラムをコンパイルしました。 Ubuntuでは、私はこのコードを参照してください。この出力を生成奇妙なCoutの振る舞い

string s = values_[9]; 
cout << s << endl; 
cout << s << "x\n"; 

high 
xigh 

二行目の予想出力が "highx" です。私はvalues_ [9]の値がもともとは(Windowsで書かれた)ファイルから読み込まれていることを知っています。他の文字列の印刷は正常に動作しているようです。

ここでは何が起こっていますか?

+2

値は何ですか? – Itsik

答えて

8

出力をcat -Aにパイプして実行します。おそらくsの値、またはendlによって生成された出力のいずれかが'\r'文字になります。これは通常、カーソルを行頭に戻します。

EDIT:さらなる考えでは、'\r'はによって生成された出力ではなく、sにほぼ確実にあります。面白いロケールがあるかもしれないと思っていましたが、と等しいと"high\r"は症状を説明しています。

EDIT2:ご使用のシステムにcat -A(GNU拡張機能)がない場合は、cat -vを試してください。もし必死なら、od -cを試してください。

+0

+1(Windowsにはないので、異種の観測値を追加してください。) –

+0

実際、 '\ r''はカーソルをWindows上の行の先頭に送ります(どこに書くかによって異なりますが'cmd'ウィンドウでそのように動作します)。違いは、Windowsはテキストファイルの行終端文字として\ n "" \ n ""を使用するのに対し、Windowsは\ n ""をテキストファイルに使用する点です。うまく動作するソフトウェアはおそらくどちらのシステムでも分離された ''\ r' '文字を生成しません。 –

+0

OKですが、出力に応じて、孤立した '\ r'があります(そうでなければ' x'はそれ自身の行にあります)。 –

3

おそらく起こっていることは、\rvalues_[9]にあるということです。

4

印刷している文字列には、キャリッジリターン'\r'が含まれています。何が起こっているのは、highを印刷してから、キャリッジリターンで、カーソルをラインの先頭に戻していることです。次に、xを印刷すると、行の最初の文字が上書きされます。

あなたが(例えばdos2unix(1)または他の多くのオプションを持つ)ソースファイルから改行を削除するか、またはでファイルを読み込んだ後、キャリッジリターンを削除するようにコードを変更する必要がありますどちらか。