【问题标题】:Preprocessor and subsitution of format string预处理器和格式字符串的替换
【发布时间】:2015-10-04 17:47:33
【问题描述】:
如果我说:
#define SIZE 10
之后:
scanf("%SIZEs", s);
我有一个运行时错误。预处理器应该在编译之前用10 替换SIZE,所以这应该等于(在我看来)写
scanf("%10s", s);
那么,错在哪里?
【问题讨论】:
标签:
c
string
c-preprocessor
scanf
format-string
【解决方案1】:
在你的代码中,问题出在
scanf("%SIZEs", s);
格式字符串(通常为字符串文字)的引号" " 之间的任何内容都不会通过宏替换被替换。
因此,在预处理之后,您的 scanf() 与您所写的相同,并且 %S(或整体上的 %SIZEs)是一个无效的格式说明符,您进入 undefined behaviour 并因此得到错误。
您可以尝试以下解决方法
scanf("%"SIZE"s", s);
这样,SIZE 将在引号之外,并在预处理阶段被考虑替换。
【解决方案2】:
如果您只使用 SIZE 进行格式化,您也可以使用:
#define SIZE "10"
scanf("%"SIZE"s", s);
【解决方案3】:
不能用宏替换字符串文字的内容。
例如,它执行以下操作:
#include <stdio.h>
#define S_(x) #x
#define S(x) S_(x)
#define SIZE 10
int main(void){
char s[SIZE + 1];
scanf("%" S(SIZE) "s", s);
puts(s);
return 0;
}