-1

このような名前のファイルがほぼ 120 個あります - a1.txt、a2.txt... ユーザーからの入力を int として受け取り、それを使用して特定のファイルを開く必要があります。そのためにマクロを使用しようとしましたが、機能しません。これが私が使用していたものです。ファイルはユニコードです

#define concat(d) L"a"#d".txt" 
.
.
.
wchar_t *basefile = concat(d);

wprintf を使用して concat が生成しているものを確認したところ、「a」までしか読み取らず、マクロの残りの部分を無視することがわかりました。ここで何を修正する必要があるか、または私が使用できる代替方法があるかどうかを指摘してください.ありがとう!

4

2 に答える 2

1

コメントに記載されているように、コンパイル時マクロを使用して、実行時に取得されたユーザー入力を処理することはできません。

あなたが望むのはライブラリ関数sprintf()です:

http://www.manpages.info/linux/sprintf.3.html

ワイド文字列の場合、次を使用できますswprintf()

http://www.cplusplus.com/reference/clibrary/cwchar/swprintf/

元の問題sprintf()は、出力バッファーの長さの引数を取らないことであり、バッファーの末尾を超えて文字列を書き込み、スタックまたはヒープを上書きする可能性があることに注意してください。sprintf()など、これを修正するバリエーションがありますsnprintf()。しかし幸いなことに、ワイド バージョンswprintf()は出力バッファ サイズを指定する引数を取ります。

于 2012-11-18T07:31:59.250 に答える
0

この番号が実際に実行時のユーザー入力である場合は、ファイル名を構成する必要がありますsnprintf。あなたの方法は、これがコンパイル時にファイルを識別するために知られている数字(実際にはどんなトークンでも)である場合にのみ機能します。

だから何か

#define D 42

.
.
.
wchar_t *basefile = concat(D);

動作するはずです。

于 2012-11-18T07:33:06.413 に答える