3

如果我放:

#define SIZE 10

之后:

scanf("%SIZEs", s);

我有一个运行时错误。预处理器应该SIZE10before 编译,所以这应该等于(在我看来)写

scanf("%10s", s);

那么,错误在哪里?

4

3 回答 3

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;
}
于 2015-07-15T15:34:06.923 回答
2

在您的代码中,问题出在

  scanf("%SIZEs", s);

" "位于格式字符串(通常为字符串文字)的引号之间的任何内容都不会通过 MACRO 替换来替换。

因此,在预处理之后,并且(或,整体上)是一个无效的格式说明符后,scanf()您的内容与编写时的内容相同,您会陷入 未定义的行为并因此出现错误。%S%SIZEs

您可以尝试解决方法

 scanf("%"SIZE"s", s);

这样,SIZE将在引号之外,并将在预处理阶段考虑替换。

于 2015-07-15T15:26:14.270 回答
1

如果您仅使用 SIZE 进行格式化,您还可以使用:

#define SIZE "10"
scanf("%"SIZE"s", s);
于 2015-07-15T15:28:55.773 回答