私はここのようなコードを少し持っています:
#define MAXSIZE 100
int main() {
char str[MAXSIZE+1];
scanf("%100s", str);
...
問題は、MAXSIZE が定義されているにもかかわらず、まだ "マジック ナンバー" 100 を持っていることです。MAXSIZE を scanf フォーマット文字列に適切に「挿入」する方法はありますか? (ピュア C、c-99 標準)
ありますが、次を使用したほうがよいでしょうfgets()
:
if (fgets(str, sizeof str, stdin) != NULL) {
// process input
}
これの良い点は (間違いなく読みやすさの向上は別として) fgets()
、サイズが正しく処理されるscanf()
ことです。バッファを宣言するときのサイズ。また、配列は常に NUL で終了します。エラーが発生しにくい方法。
元の質問に関して: 通常の「文字列化」トリックを試してください:
#define REAL_STRINGIFY(x) #x
#define STRINGIFY(x) REAL_STRINGIFY(x)
scanf("%" STRINGIFY(MAXSIZE) "s", str);
しかし、これは非常に醜いですね。