printf如何知道格式参数的长度?

5
int printf (const char* format, ... );

这是printf的签名。
我不明白的是,printf如何知道第一个参数(const char* format)的长度。
它知道开头(因为它是一个指针,我理解这一点),但指针没有结束或其他东西。通常当你想打印某些内容时,你必须给出一个长度(例如Linux的sys_write),那么printf如何知道呢?
编辑:
我已经更仔细地查看了我在ASM中编写的代码,我认为它只是寻找一个\0字符。这正确吗?
3个回答

12

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

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

meow\0

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


1
为什么我们看到的是 '\0' 而不是 '0',因为没有字符叫做 '\0'。它怎么可能只占用 1 个字节呢? - 4pie0
1
@cf16 字符只是以不同方式解释的字节。48被解释为零,而0被解释为NULL。 - MasterMastic
'\0'是0的字符表示,这不可以仅仅是'0',因为它是48的表示,对吗? - 4pie0
如何以类似的方式打印 '\0'(给定其 0 十进制表示)? - 4pie0
@cf16:可以打印任何代码的字符。但是许多代码在屏幕上不会产生任何可见的响应。相应的“字符”是不可见的,它们没有与之相关联的任何可见“图像”。但是,如果将输出重定向到文件,则会发现所有内容都已正确打印。 - AnT stands with Russia
显示剩余19条评论

1
当字符串被正确声明时,它的末尾总是有一个 NULL (\0) 值,这个标记用于标记所有打印函数的字符串结尾。如果省略它(在大多数情况下很难做到),打印函数将继续打印内存,直到遇到内存中的 0 值为止。
"Anything" 是以 i n g \0 结尾的 char 数组。
编辑: '\0' == 0,而 '0' != 0。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接