2013-10-16 69 views
2

我有一些代碼喜歡這裏:scanf函數:與宏(#定義常量)模板中

#define MAXSIZE 100 

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

問題是,我仍然有「幻數」 100,儘管定義MAXSIZE。 有沒有辦法將MAXSIZE正確地插入到scanf格式字符串中? (純C,C-99非標準)

+0

你必須使用scanf嗎?如果不是,請嘗試'fgets()' – jev

回答

3

有,但你會更好使用fgets()

if (fgets(str, sizeof str, stdin) != NULL) { 
    // process input 
} 

關於這個好東西(除了一個不容置疑的可讀性增強)是fgets()需要護理的大小正確,我。即它佔了終止0字符(其中scanf()沒有),因此在聲明緩衝區時不需要添加一個大小。它也總是NUL終止你的陣列。不太容易出錯。


至於原來的問題:儘量平常「字符串」絕招:

#define REAL_STRINGIFY(x) #x 
#define STRINGIFY(x) REAL_STRINGIFY(x) 

scanf("%" STRINGIFY(MAXSIZE) "s", str); 

但是,這是非常醜陋的,不是嗎?

+0

非常醜陋!沒有人想要甚至想到它。 – haccks

+2

@haccks,但我喜歡它:),一種方法是OP可以聲明一個新的宏#define MAX「100」' –

+0

@haccks正好。那真令人噁心。 – 2013-10-16 17:27:30