質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

317閲覧

C++ キャリッジリターンについて

OhaseO

総合スコア3

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2024/11/08 14:07

編集2024/11/08 14:47

実現したいこと

使い慣れていないエスケープシーケンスを使ってみただけなのですが、
出力が思っていたものと異なります。
その原因を知りたい次第です。

該当のソースコード

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2024/11/08 15:10

そちらの環境で再現性があるのなら、処理系依存か、端末依存な気がします。あるいは確認ミス。 Windows10で、 処理系:g++ (gnu C++) 端末:コマンドプロンプト だと、普通に wwwlo ですね。 お書きの現象から考えられる原因の例をいくつか挙げただけで、C++規格上でこの動作が処理系依存かどうか等とか、端末によってはあり得るのか等までは確認してません。
melian

2024/11/08 16:40

手元の環境は 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 のコンソールとのことですので、参考にはならないかもしれません。
OhaseO

2024/11/09 00:19

otnさん、melianさん コメントありがとうございます。 仰る通り、端末依存でプロンプト文字列が影響していそうです。 Visual Studioデバッグコンソールでは"www o"になりますが、コマンドプロンプトやPowerShellでは"wwwlo"になりました。 また、文末に\nを追加すればVisual Studioデバッグコンソールでも"wwwlo"になることから、プロンプト文字列が影響している(\nを追加すれば空白行でプロンプト文字列が空振りしている?)と理解しました。
guest

回答2

0

コメントより:
長くなったので回答の方に書きます。

Visual Studioデバッグコンソールでは"www o"になりますが、コマンドプロンプトやPowerShellでは"wwwlo"になりました。
また、文末に\nを追加すればVisual Studioデバッグコンソールでも"wwwlo"になることから、プロンプト文字列が影響している(\nを追加すれば空白行でプロンプト文字列が空振りしている?)と理解しました。

そういうことであれば、原因は下記のどちらかでしょう。
(1) Visual Studioデバッグコンソールでは、プログラムの文字出力の後に、(実行したプログラムでなく)コンソール自体が「空白」または「空白と改行」を出力している(改行付きかどうかは、質問文に現象の詳細な説明がないので不明)
(2) 同上だが、「プログラムの文字出力の最後が改行でない場合」という限定条件が付いている
(現在のMacの標準シェルのZshはデフォルトだと、コマンドの出力が改行で終わってないと「%という文字のリバース文字」(と改行)を追加出力するという仕様なので、「これは何?」と思った人多数のようです)

(1)はさすがに変すぎるので、(2)ですかね。Zshという類似例もあるし。あるいは、もしかすると
(3) 「プロンプト文字列」が「空白+改行」で始まっている
とかも、可能性としてはあり得ますが、考えにくい気がします。これも変だけど。

上述のZshの場合は「なんか変なことが起こっているな」とすぐ分かるので、自分で調べるきっかけになりますが、空白だけだとなかなか気づけないですね。バグでなく仕様ならどこかに書いてあるとは思いますが。

「後ろにLFの続かないCR」を出力してみたいと思ったということは、このあたりに興味があるのでしょうから、色々なケースを試してみると原因が絞り込めるかと思います。とは言え、「Visual Studioデバッグコンソール」に拘る必要がなければ、コマンドプロンプトやWindowsTerminalなど普通の端末を使うのが分かり易いです。

なお、

使い慣れていないエスケープシーケンスを使ってみただけなのですが、

CR や LF はエスケープシーケンスとは言いません。総称するなら「制御文字」「コントロール文字」とかですかね。

投稿2024/11/09 07:19

編集2024/11/09 07:25
otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Windows 11、Visual Studio 2022で確認しました。
質問者さんの現象は再現しました。

Visual Studio 2022のデバッグコンソールは、「VsDebugConsole.exe」を経由してコマンドプロンプトを起動しています。
場所は、

C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Platform\Debugger\VsDebugConsole.exe

です。

通常のコマンドプロンプト、または、「Developer Command Prompt for VS 2022」では正常に表示しているので、このプログラムが何かしているのでしょう。
これ以上、調査しても、わかりませんでした。

Visual Studioの横にコマンドプロンプトを開いておいて、実行ファイルで動作確認しても、たいした手間ではないです。
悩むよりも、こういうものだと納得して、開発を前に進めたほうがよいと思います。

投稿2024/11/09 02:19

hiroki-o

総合スコア1059

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OhaseO

2024/11/09 06:22

確認ありがとうございます。 このような基本的なプログラムでも意図しない挙動になることにちょっとびっくりです。 理解不足なだけとも思っていましたが、そういうわけでもない領域と納得しましたので、 本件はクローズさせていただきます。 みなさん、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問