【问题标题】:Why only multiple "%" is accepted by printf?为什么 printf 只接受多个“%”?
【发布时间】:2016-08-12 06:31:36
【问题描述】:

下面的程序给出输出%%。为什么?

#include <stdio.h>

int main() {
    //code
    printf("%%%%");
    return 0;
}

输出:

%%

【问题讨论】:

  • 请展示您迄今为止的研究/调试工作。请先阅读How to Ask页面。

标签: c printf format-specifiers


【解决方案1】:

TL;DR % printf() 的有效转换说明符。

引用 C11,第 §7.21.6.1 章,用于转换说明符,

每个转换规范都由字符% 引入。在%之后,以下 依次出现:

.....

——一个转换说明符字符,用于指定要应用的转换类型。

并且,从第 8 段开始,对于% as 一个 转换说明符

用于% 转换说明符

% 写入一个% 字符。没有参数被转换。完整的 转换规范应为%%

您的代码有一对%%s。

【讨论】:

    【解决方案2】:

    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..从技术上讲,它表示转换说明符的开始
    • 我的意思是,当 printf 被调用时,char* 不是直接写入的,而是经过预处理的,因此每个特殊的 char 序列都会被替换。例如,%s 被替换为 char*
    • 哦,我明白了。对此我很抱歉,我学的是法语,所以我并不总是选择正确的翻译
    • 没什么好遗憾的,没关系,我们理解。乐于助人。
    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 2013-05-21
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多