実現したいこと
使い慣れていないエスケープシーケンスを使ってみただけなのですが、
出力が思っていたものと異なります。
その原因を知りたい次第です。
該当のソースコード
C++
1#include <iostream> 2 3using namespace std; 4 5int main() 6{ 7 cout << "hello" << '\r' << "www"; 8 9 return 0; 10}
結果
www o
"wwwlo"になることを期待していましたが、"www o"になりました。
その原因を知りたい次第です。
よろしくお願いいたします。
追記
cout << "hello" << '\r' << "www\n";としたところ、
"wwwlo"になりましたが、依然として理由がよく分かりません。
補足情報
Visual Studio 2022 (v143)
既定 (ISO C++14 標準)
コンソール (/SUBSYSTEM:CONSOLE)
そちらの環境で再現性があるのなら、処理系依存か、端末依存な気がします。あるいは確認ミス。
Windows10で、
処理系:g++ (gnu C++)
端末:コマンドプロンプト
だと、普通に wwwlo ですね。
お書きの現象から考えられる原因の例をいくつか挙げただけで、C++規格上でこの動作が処理系依存かどうか等とか、端末によってはあり得るのか等までは確認してません。
手元の環境は Ubuntu Linux 24.04/g++ 13.2.0/bash 5.2.21 ですが、実行結果は以下の様になります。
$ ./x
www$
od コマンドで出力の中身を確認してみます。
$ ./x | od -tx1a
0000000 68 65 6c 6c 6f 0d 77 77 77
h e l l o cr w w w
つまり、hello の末尾の "lo" 部分に bash のプロンプト文字列("$ ")が上書きされている状態です。そこで、プロンプトをスペース1文字に変更して実行してみます。
$ export PS1=' '
./x
www o
そちらは Windows のコンソールとのことですので、参考にはならないかもしれません。
otnさん、melianさん
コメントありがとうございます。
仰る通り、端末依存でプロンプト文字列が影響していそうです。
Visual Studioデバッグコンソールでは"www o"になりますが、コマンドプロンプトやPowerShellでは"wwwlo"になりました。
また、文末に\nを追加すればVisual Studioデバッグコンソールでも"wwwlo"になることから、プロンプト文字列が影響している(\nを追加すれば空白行でプロンプト文字列が空振りしている?)と理解しました。
回答2件
あなたの回答
tips
プレビュー