Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保护scanf不读取太多带有define的字符?_C_Arrays_String_Scanf_C Preprocessor - Fatal编程技术网

保护scanf不读取太多带有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

通常,我使用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?
}
#包括
#定义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字符串文字。