保护scanf从定义中读取太多字符?

gsa*_*ras 4 c arrays string scanf c-preprocessor

通常我使用一个字符串大小的define,但是当我使用时scanf(),我想保护函数不要读取太多字符(并为null终止符保留空间).我想知道我是否可以使用我的定义,而不是硬编码的幻数...

#include <stdio.h>

#define MAXLEN 4

int main(void) {
    char a[MAXLEN];
    scanf("%3s", a); // Can I do that with 'MAXLEN' somehow?
}
Run Code Online (Sandbox Code Playgroud)

可能吗?如果有,怎么样?

xin*_*ing 9

使用define来stringify:

#define LENSTR_(x) #x
#define LENSTR(x) LENSTR_(x)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

#define MAXLEN 3

char a[MAXLEN + 1];
scanf("%" LENSTR(MAXLEN) "s", a);
Run Code Online (Sandbox Code Playgroud)

  • @ Jean-FrançoisFabre:只使用一个宏将扩展为"MAXLEN".两级方法首先扩展为`LENSTR_(3)`,然后将其字符串化为"3". (5认同)
  • 这只有在`MAXLEN`是十进制整数字面时才有效.它会因`#define MAXLEN 0x10`而失败 (2认同)
  • @savram:`#`是宏定义中的"stringification"或"stringizing"运算符.它将参数转换为C字符串文字. (2认同)