【问题标题】:How does printf know the length of the format argument?printf 如何知道格式参数的长度?
【发布时间】:2013-03-17 23:46:31
【问题描述】:
int printf (const char* format, ... );

这是 printf 的签名。 我不明白的是,printf 怎么知道第一个参数的长度(const char* format)。

它知道开始(因为它是一个指针,我明白了),但指针没有结束之类的。通常当你想打印一些东西时你必须给出一个长度(例如Linux的sys_write)那么printf是怎么知道的呢?

编辑:

我一直在查看我在 ASM 中编写的代码,我认为它只是寻找一个 \0 字符。对吗?

【问题讨论】:

    标签: c++ c assembly printf


    【解决方案1】:

    它是一个以 null 结尾的字符串(与 C 中的所有字符串一样),因此第一个 ASCII NUL('\0' 或纯 0)字节表示字符串的结尾。

    如果你在 C 中有一个字符串 "meow",它实际上使用了 5 个字节的内存,在内存中看起来像这样。 \0 显然是一个值为 0 的单字节。

    meow\0
    

    如果您想知道如何表示实际的 '0' 数字:数字 0..9 的 ASCII 值是 48..57,因此 "me0w" 的第三位将有 48 字节。

    【讨论】:

    • 为什么我们看到'\0'而不是'0',没有字符'\0'。怎么可能是1byte?
    • @cf16 字符只是解释不同的字节。 48 被解释为 0,0 被解释为 NULL。
    • 刚刚尝试在没有\0 的情况下调用printf。计算机没有爆炸 :(。但感谢您向我保证这就是答案。
    • 当然我知道,为什么我们看到 \0,如果我定义 char c='K' 就没有 \
    • \0 是自动添加的,因为 C 中的 all 字符串末尾都有一个。强迫程序员手动把它放在那里是非常愚蠢的。如果你有一个 char 编译器和接受它的函数知道它只是一个字符,所以在它之后包含 NUL 字节会浪费空间。
    【解决方案2】:

    当一个字符串被正确声明时,它的末尾总是有一个 NULL (\0) 值,该标记用于标记所有这些打印函数的字符串结尾。如果省略(在大多数情况下很难做到),打印函数将一直打印内存,直到内存中的值为 0。

    "Anything" 是一个以 i n g \0 结尾的字符数组

    编辑: '\0' == 0 和 '0' != 0

    【讨论】:

      【解决方案3】:

      它不知道。试试printf("Hello \0 World\n");printf 不知道该字符串包含 15 个字符。

      【讨论】:

        猜你喜欢
        • 2019-01-03
        • 2012-10-06
        • 2021-04-15
        • 1970-01-01
        • 2019-11-11
        • 2017-06-20
        • 1970-01-01
        • 2018-08-08
        • 2021-11-05
        相关资源
        最近更新 更多