保护scanf不读取太多带有define的字符?
通常,我使用define来定义字符串的大小,但是当我使用保护scanf不读取太多带有define的字符?,c,arrays,string,scanf,c-preprocessor,C,Arrays,String,Scanf,C Preprocessor,通常,我使用define来定义字符串的大小,但是当我使用scanf()时,我希望防止函数读取太多字符(并为空终止符保留空间)。我想知道我是否可以用我的define,而不是一个硬编码的幻数 #include <stdio.h> #define MAXLEN 4 int main(void) { char a[MAXLEN]; scanf("%3s", a); // Can I do that with 'MAXLEN' somehow? } #包括 #定义MAXL
scanf()
时,我希望防止函数读取太多字符(并为空终止符保留空间)。我想知道我是否可以用我的define,而不是一个硬编码的幻数
#include <stdio.h>
#define MAXLEN 4
int main(void) {
char a[MAXLEN];
scanf("%3s", a); // Can I do that with 'MAXLEN' somehow?
}
#包括
#定义MAXLEN 4
内部主(空){
字符a[MAXLEN];
scanf(“%3s”,a);//我可以用“MAXLEN”这样做吗?
}
可能吗?如果是,如何?使用定义来字符串化:
#define LENSTR_(x) #x
#define LENSTR(x) LENSTR_(x)
然后您可以使用:
#define MAXLEN 3
char a[MAXLEN + 1];
scanf("%" LENSTR(MAXLEN) "s", a);
使用MAXLEN 3;然后定义
chara[MAXLEN+1]
我已经链接到了副本,但是为什么不使用fgets()
和sscanf()
?我可以,但是我想知道scanf()
@IharobAlAsimi,谢谢@gsamaras我在原始问题中发布了另一个解决方案(我在这里发布了,但它被关闭了)@Jean Françoisfare,因为这就是在C中严格化宏参数值的方式…@AnttiHaapala:是的,但大多数人只是复制了这种模式,而不知道为什么这是必要的。对于变量字段,这并不像预期的那样有效。如果你有一个VLA怎么办?这只在MAXLEN
是十进制整数文本时有效。对于#define MAXLEN 0x10
@Jean-FrançoisFabre,它将失败:仅使用一个宏将扩展到“MAXLEN”
。两级方法首先扩展到LENSTR_u3)
,然后将字符串化为“3”
@savram:#
是宏定义中的“字符串化”或“字符串化”操作符。它将参数转换为C字符串文字。