为什么格式说明符的参数没有正确打印?

时间:2016-12-08 06:32:03

标签: c syntax printf format-specifiers

我正在学习C,由于某种原因,我的%s并没有打印出类似的内容。它只是随机字符,%d它总是打印一个像4600688那样的数字,而不是像我设置的那样:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("why is %s happening to me"), "this";
    return 0;
}

这导致:

  

为什么PE会发生在我身上

(以及return文字)。

这是编译错误还是我该如何解决?

1 个答案:

答案 0 :(得分:7)

在您的代码中

 printf("why is %s happening to me"), "this";

应该是

 printf("why is %s happening to me", "this");

否则,您正在调用undefined behavior,因为%s函数签名要求提供printf()转换说明符所需的参数。

引用C11,章节§7.21.6.3

#include <stdio.h>
int printf(const char * restrict format, ...);
     

printf函数等同于fprintf,其中插入了参数stdout   在printf的参数之前。

,并且,从§7.21.6.1开始,“fprintf函数”(强调我的

  

fprintf函数将输出写入stream所指向的流,受控制   format指向的字符串,指定后续参数的方式   转换为输出。如果格式的参数不足,则行为是   未定义。

也就是说,这很好,因为 语法 有效,感谢(或责备comma-operator