【问题标题】:Reason behind the solution to the question问题解决方案背后的原因
【发布时间】:2010-07-10 06:41:03
【问题描述】:

下面的输出是什么,这背后的原因是什么?

main()
{
    printf("%%%%");
}

答案是“%%”,但我不知道为什么。

【问题讨论】:

  • @Paul:我看不出它有什么作用,因为他知道问题和答案。 “为什么”是一种横向的东西,不管是不是作业,答案都是一样的。
  • 因为只回答一个问题是不够的 v 需要知道其背后的原因,否则在某事上获得的知识将是非常肤浅的,保罗似乎你真的没有我的问题的答案所以你反馈
  • @GMan:如果是家庭作业,那么最好给出提示而不是完整的解决方案,这样学生就有机会实际学习一些东西。不过在这种情况下为时已晚。
  • @Paul:我知道标签的用途,我没有看到任何提示。告诉他查找格式说明符?不妨为他转述一下,不要浪费他的时间。
  • @GMan:特别是在这种情况下,学生只需将其指向man 命令就会学到更多。 man printf(或在他的系统上等效)会给他所有他需要的。

标签: c formatting printf


【解决方案1】:

% 是格式说明符的开头。 (例如,"%d" 的意思是“打印一个int”。)格式说明符转义后的%,打印一个“%”。

也就是说,"\\" 产生一个反斜杠,"%%" 产生一个百分号。

【讨论】:

    【解决方案2】:

    从技术上讲,输出可以是任何内容,因为您没有在末尾打印换行符,还因为您没有包含 stdio.h :-)。

    但是,纠正两个错误:

    #include <stdio.h>
    
    int main(void)
    {
        printf("%%%%\n");
        return 0;
    }
    

    上面应该打印%%,后跟一个换行符。

    每个转换规范都由字符 % 引入。

    ...

    转换说明符及其含义为:

    ...

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

    (C99 7.19.6.1)。

    【讨论】:

    • 缺少换行符不会使输出未定义。
    • @Michael: groups.google.com/group/comp.lang.c/browse_thread/thread/…(或参见 C99 中的 7.19.2p2)。
    • C 标准允许文件行为中有很多愚蠢的东西,比如在二进制文件和固定大小、基于行记录的文本文件的末尾出现随机的额外 0 字节。标准有很大的不同,它允许愚蠢的事情避免使无法修复的古老遗留系统不符合标准,并允许有用的多样性避免让我们陷入当前的实现中。在任何具有字节流文件的当今系统上(一种特殊情况是二进制模式和文本模式是等效的并记录在案的情况下),缺少最后的换行符不会造成不良后果。
    【解决方案3】:

    在printf中,%通常用来表示一个token,比如%s或者%d或者%5.2f。如果要输出文字 %,请使用 %%

    【讨论】:

      【解决方案4】:
      Format specifiers are typically introduced by a % character,
      and a literal percent sign can be copied into the output 
      using the escape sequence %%.
      

      Source.

      因此,您可以使用 %% 在输出中打印 %。该问题有一系列 % 符号,因此输出为 %%。

      【讨论】:

        猜你喜欢
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-17
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多