2017-09-16 5 views
4

通常は文字列のサイズを定義していますが、scanf()を使用すると、関数があまりにも多くの文字を読み込むことを防ぎたい(そしてヌルターミネータのためのスペースを確保する)必要があります。私はハードコードされた魔法の数字の代わりに私の定義を使ってこれを行うことができるかどうか疑問に思っていました...scanfが定義済みの文字数が多すぎますか?

#include <stdio.h> 

#define MAXLEN 4 

int main(void) { 
    char a[MAXLEN]; 
    scanf("%3s", a); // Can I do that with 'MAXLEN' somehow? 
} 

それは可能ですか?はいの場合、どうですか?

+0

使用MAXLEN 3。 'char a [MAXLEN + 1]'を定義する –

+0

私は重複にリンクしましたが、 'fgets()'と 'sscanf()を使わないのはなぜですか? –

+0

私はできましたが、私は 'scanf()' @IharobAlAsimiについて心配していました。ありがとう! – gsamaras

答えて

9

使用すると、文字列化するために定義されています。

#define LENSTR_(x) #x 
#define LENSTR(x) LENSTR_(x) 

、あなたが使用することができます。

#define MAXLEN 3 

char a[MAXLEN + 1]; 
scanf("%" LENSTR(MAXLEN) "s", a); 
+1

@ Jean-FrançoisFabreこれはC言語のマクロ引数の値を文字化しているからです... –

+0

私はupvotingですので、 – savram

+1

@AnttiHaapala:はい、しかし、ほとんどの場合は、**これが必要な理由を知らずにそのパターンをコピーします。そして、それは可変フィールドに期待どおりに機能しません。 VLAをお持ちの場合はどうなりますか? – Olaf

関連する問題