🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

C++

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

Q&A

解決済

2回答

6962閲覧

C++:_tprintfの挙動に関して

退会済みユーザー

退会済みユーザー

総合スコア0

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

C++

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

0グッド

0クリップ

投稿2019/09/27 05:05

■環境
IDE:Windows Server 2017
言語:C++
ビルド形式:Unicodeビルド

■概要
以前も質問させて頂いた内容に関連しますが。。。
以下の記述で、コマンドプロンプトに出力を行っています。
srvNameに格納したunicode文字(サロゲート文字)が表示されないのは、コマンドプロンプトの文字設定上、UTF16を指定できないためであることは承知しています。
しかし、それ以降の日本語「'は登録完了です。\n」まで表示されなくなる理由がわかりません。
なお、ASCII文字をsrvNameに格納した場合は、正常に「'は登録完了です。\n」は表示されます。

●ソースコード

CString srvName = L"????" _tsetlocale(LC_ALL, _T("")); _tprintf(L"サーバ'" + srvName + L"'は登録完了です。\n");

●コマンドプロンプト

サーバ'

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

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

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

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

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

Zuishin

2019/09/27 09:13

CString srvName = L"????" だとどうなりますか? 文字コードが変わっています。そのままコピペしてください。
退会済みユーザー

退会済みユーザー

2019/09/29 09:59

フォーマット演算子%lsを3つ用意し、カンマで後ろに変数を3つ用意したところ、Zuishin様がおっしゃる通り、「変換できない文字は '?' で表示され」、他の日本語文字は正常に出力されました。ありがとうございます。
guest

回答2

0

ベストアンサー

_tprintfはUnicodeビルドではwprintfに展開されると思います。
実装を詳細に確認したわけではありませんが、printf系の書式文字列は一文字ずつチェックされます。以前調査したときは、マルチバイト文字列に不正な文字が入っていた場合、エラーになったような記憶があります。
おそらくですが、書式文字列を一文字ずつマルチバイト文字列に変換して、エラーだった場合それ以降は出力しないのではないかと思います。

未確認ですが質問のコードを例えば

CString srvName = L"????" _tsetlocale(LC_ALL, _T("")); _tprintf(_TEXT("%s"), L"サーバ'" + srvName + L"'は登録完了です。\n");

にすれば、変換できない文字は '?' で表示され、以降の文字も表示されるではないかと思います。

投稿2019/09/27 09:00

Bull

総合スコア986

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

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

退会済みユーザー

退会済みユーザー

2019/09/29 09:59

フォーマット演算子%lsを3つ用意し、カンマで後ろに変数を3つ用意したところ、Bull様がおっしゃる通り、「変換できない文字は '?' で表示され」、他の日本語文字は正常に出力されました。ありがとうございます。
guest

0

まずは、_tprintfの問題なのか、コンソールの問題かを切り分けてみましょう。

出力をファイルにリダイレクトして正常に出力されるようであれば、問題はコンソール、ということになります。

投稿2019/09/27 05:11

maisumakun

総合スコア145963

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

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

退会済みユーザー

退会済みユーザー

2019/09/27 05:48

大変申し訳ないですが、ファイルにリダイレクトする方法を教えて頂くことは可能でしょうか。
maisumakun

2019/09/27 05:51

コンソールから「filename.exe > output.txt」のように実行してください。
退会済みユーザー

退会済みユーザー

2019/09/27 06:03

ありがとうございます。リダイレクトしたところファイルは作成されましたが、出力はされませんでした(文字はなにも書きこまれていません)。ファイルの保存形式が問題の可能性も考慮し、UTF16LE(BOM付き)で保存したファイルを作成した場合も、同様に書きこみはありません。
退会済みユーザー

退会済みユーザー

2019/09/27 06:05

リダイレクトの場合は、コンソールに「サーバ'」(上記の質問で記載の結果)が表示されなくなるため、正しくリダイレクト自体が誤りではないという認識です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問