【发布时间】:2016-08-12 06:31:36
【问题描述】:
下面的程序给出输出%%。为什么?
#include <stdio.h>
int main() {
//code
printf("%%%%");
return 0;
}
输出:
%%
【问题讨论】:
-
请展示您迄今为止的研究/调试工作。请先阅读How to Ask页面。
标签: c printf format-specifiers
下面的程序给出输出%%。为什么?
#include <stdio.h>
int main() {
//code
printf("%%%%");
return 0;
}
输出:
%%
【问题讨论】:
标签: c printf format-specifiers
TL;DR % 是 printf() 的有效转换说明符。
引用 C11,第 §7.21.6.1 章,用于转换说明符,
每个转换规范都由字符
%引入。在%之后,以下 依次出现:.....
——一个转换说明符字符,用于指定要应用的转换类型。
并且,从第 8 段开始,对于% as 一个 转换说明符
用于% 转换说明符
%写入一个%字符。没有参数被转换。完整的 转换规范应为%%。
您的代码有一对%%s。
【讨论】:
Printf 函数的第一个参数是format,由char* 表示,它不是字符串。
这就是为什么要打印int,例如,你必须写"%d"。所以%是一个特殊字符,如果你只写%作为格式,编译器不会高兴,因为它在等待%之后的东西(d、p、x、s、f、. ..)。
但是,写%% 的意思是“打印我一个转义的%”。这就是为什么%%%% 打印出%%
编辑:如果你想要一个能准确打印你给出的函数,你可以使用write:
char* mystr = "%%%%";
write(STDOUT_FILENO, mystr, strlen(mystr));
【讨论】:
Printf function's first argument is a format represented by a char*, it's not a string. .. 你能详细说明一下吗?
So % is a special character..从技术上讲,它表示转换说明符的开始。
char* 不是直接写入的,而是经过预处理的,因此每个特殊的 char 序列都会被替换。例如,%s 被替换为 char*