0

重複の可能性:
Cでエスケープシーケンスをエスケープまたは終了する方法

ofn.lpstrFilter拡張子の先頭に数字「3」を書くことを許可していませんか?どのフィルターを使用する必要がありますか?

ofn.lpstrFilter = "text1 (*.txt)\0*.txt\03D text (*.txt)\0*.txt\0";

上記の例では、直後に\0、を使用3Dしていますが、lpstrFilterでは許可されていません。なんで?それらの間にスペースを使いたくありません。

出力は次のようになります。

text1 (*.txt)
3D text (*.txt)

の間にスペースを使用する\03D、出力は次のようになります。

text1 (*.txt)
 3D text (*.txt)  // note one space is added before 3D
4

1 に答える 1

4

ここでの問題は、誤って8 進文字定数を使用していることです。あなたが書くとき、あなた\03D...はコンパイラがこれを として解釈することを期待してい\0 3D...ます。ただし、コンパイラはルールに従い、これを に変換し\03 D...ます。NULこれは文字を生成しないため、その前の*.txt拡張は次の文字に拡張され\0ます。次の*.txt拡張子は、ファイル タイプのドロップダウン リストに表示される表示文字列として誤って解釈されるようになりました。

解決策は、文字列を分割し、代わりに次のように記述することです。

ofn.lpstrFilter = "text1 (*.txt)\0*.txt\0" "3D text (*.txt)\0*.txt\0";

これにより、 が適切に終了し\0、次の数字がこのエスケープ シーケンスの一部として解釈されなくなります。

余談ですが、これは WinAPI コードなので、おそらくTCHARs の代わりにchars を使用する必要があります。コード行は次のようになります。

ofn.lpstrFilter = _T( "text1 (*.txt)\0*.txt\0" ) _T( "3D text (*.txt)\0*.txt\0" );
于 2012-12-23T17:56:26.150 に答える