2

私はここのようなコードを少し持っています:

#define MAXSIZE 100

int main() {
    char str[MAXSIZE+1];
    scanf("%100s", str);
    ...

問題は、MAXSIZE が定義されているにもかかわらず、まだ "マジック ナンバー" 100 を持っていることです。MAXSIZE を scanf フォーマット文字列に適切に「挿入」する方法はありますか? (ピュア C、c-99 標準)

4

1 に答える 1

3

ありますが、次を使用したほうがよいでしょう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);

しかし、これは非常に醜いですね。

于 2013-10-16T17:25:20.360 に答える