如果我放:
#define SIZE 10
之后:
scanf("%SIZEs", s);
我有一个运行时错误。预处理器应该SIZE
用10
before 编译,所以这应该等于(在我看来)写
scanf("%10s", s);
那么,错误在哪里?
如果我放:
#define SIZE 10
之后:
scanf("%SIZEs", s);
我有一个运行时错误。预处理器应该SIZE
用10
before 编译,所以这应该等于(在我看来)写
scanf("%10s", s);
那么,错误在哪里?
不能用宏替换字符串文字的内容。
例如,它执行以下操作:
#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;
}
在您的代码中,问题出在
scanf("%SIZEs", s);
" "
位于格式字符串(通常为字符串文字)的引号之间的任何内容都不会通过 MACRO 替换来替换。
因此,在预处理之后,并且(或,整体上)是一个无效的格式说明符后,scanf()
您的内容与编写时的内容相同,您会陷入 未定义的行为并因此出现错误。%S
%SIZEs
您可以尝试解决方法
scanf("%"SIZE"s", s);
这样,SIZE
将在引号之外,并将在预处理阶段考虑替换。
如果您仅使用 SIZE 进行格式化,您还可以使用:
#define SIZE "10"
scanf("%"SIZE"s", s);