2017-09-16 93 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