【问题标题】: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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        • 2017-06-02
        • 1970-01-01
        • 2017-09-18
        • 2015-01-21
        相关资源
        最近更新 更多