scanf:内置宏(#define常量)的模板

我有一些像这里的代码:

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

问题是我仍然有“幻数”100,虽然定义了MAXSIZE。 有没有办法正确地“插入”MAXSIZE到scanf格式字符串? (纯C,c-99标准)

有,但你最好使用fgets()

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

关于这一点的好处(除了毫无疑问的可读性提升)是fgets() 正确地处理大小即它解释了终止0字符( scanf()没有),所以你不必在声明缓冲区时添加一个大小的黑客攻击。 它也总是NUL为您终止arrays。 方式少出错。


至于原始问题:尝试通常的“stringify”技巧:

 #define REAL_STRINGIFY(x) #x #define STRINGIFY(x) REAL_STRINGIFY(x) scanf("%" STRINGIFY(MAXSIZE) "s", str); 

但这很难看,不是吗?