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