<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Formatted_Printing</id>
	<title>Formatted Printing - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Formatted_Printing"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Formatted_Printing&amp;action=history"/>
	<updated>2026-04-06T23:30:54Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=Formatted_Printing&amp;diff=908&amp;oldid=prev</id>
		<title>2022年3月17日 (四) 07:48 Zhang3</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Formatted_Printing&amp;diff=908&amp;oldid=prev"/>
		<updated>2022-03-17T07:48:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2022年3月17日 (四) 07:48的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l18&quot;&gt;第18行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第18行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''vsnprintf()'': 将格式化的数据写入缓冲区，限制写入的最大字符，使用一个 '''va_list''' 而不是  '''...'''&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''vsnprintf()'': 将格式化的数据写入缓冲区，限制写入的最大字符，使用一个 '''va_list''' 而不是  '''...'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;并且抽象。。。&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;以及抽象层包装...&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''printf()'': Wraps over ''vprintf()''&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''printf()'': Wraps over ''vprintf()''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''fprintf()'': Wraps over ''vfprintf()''&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''fprintf()'': Wraps over ''vfprintf()''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l28&quot;&gt;第28行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第28行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''vsnprintf()'': Wraps over ''vfprintf()'' with ''fmemopen()''&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ''vsnprintf()'': Wraps over ''vfprintf()'' with ''fmemopen()''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;但是，嘿! 这是一个用户空间C库示例！ 是的，是这样的。 你很可能只提供一个 “printf()”，它可以完成 “vfprintf()” 的意图，但可以一次完成。 基本上，worker函数将在它必须打印的地方打印，直到找到一个“%”字符。 如果后跟另一个'''%'''，则会打印并处理后续内容。 如果后面跟着一个有效的说明符字符，则开始解析。 否则，字符将被打印出来并继续处理。 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;我们稍后将详细解释每一项的实现。&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;但是，嘿! 这是一个用户空间C库示例！ 是的，是这样的。 你很可能只提供一个 “printf()”，它可以完成 “vfprintf()” 的意图，但可以一次完成。 基本上，worker函数将在它必须打印的地方打印，直到找到一个“%”字符。 如果后跟另一个'''%'''，则会打印并处理后续内容。 如果后面跟着一个有效的说明符字符，则开始解析。 否则，字符将被打印出来并继续处理。 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;我们稍后将详细解释每一项的实现。（译者注：然而并没有……）&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 常量定义 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 常量定义 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=Formatted_Printing&amp;diff=907&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“本文将介绍格式化打印的概念（即 ''printf()''）。  ==''printf()''是如何工作的？== 你迈向获得可靠的 ''printf()'' 功能的第一步是对其工作的理解。 你有没有试过模仿“va_list”（参数列表）并且带''void**''，比如说一种特定的语言，（译者注：这里原作者似乎使用特殊排版格式，打乱了原句单词的位置，无法正确翻译）比如... ‎总原则和目标 - ‎本地化 -…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Formatted_Printing&amp;diff=907&amp;oldid=prev"/>
		<updated>2022-03-17T07:42:48Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“本文将介绍格式化打印的概念（即 &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039;）。  ==&amp;#039;&amp;#039;printf()&amp;#039;&amp;#039;是如何工作的？== 你迈向获得可靠的 &amp;#039;&amp;#039;printf()&amp;#039;&amp;#039; 功能的第一步是对其工作的理解。 你有没有试过模仿“va_list”（参数列表）并且带&amp;#039;&amp;#039;void**&amp;#039;&amp;#039;，比如说一种特定的语言，（译者注：这里原作者似乎使用特殊排版格式，打乱了原句单词的位置，无法正确翻译）比如... ‎总原则和目标 - ‎本地化 -…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;本文将介绍格式化打印的概念（即 ''printf()''）。&lt;br /&gt;
&lt;br /&gt;
==''printf()''是如何工作的？==&lt;br /&gt;
你迈向获得可靠的 ''printf()'' 功能的第一步是对其工作的理解。 你有没有试过模仿“va_list”（参数列表）并且带''void**''，比如说一种特定的语言，（译者注：这里原作者似乎使用特殊排版格式，打乱了原句单词的位置，无法正确翻译）比如...&lt;br /&gt;
‎总原则和目标 - ‎本地化 - ‎翻译工具 - ‎某语言官方手册 - 或者类似技术？ 这肯定行不通! 你'''必须'''使用独立版本的''&amp;lt;stdarg.h&amp;gt;''（或等效实现）中提供的''va_list''，以便能够使用可变函数。 假设使用''&amp;lt;stdarg.h&amp;gt;''，这是''printf()''的原型&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int printf(const char *format, ...);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你见过''printf()''家族的其他成员吗？ 他们是&lt;br /&gt;
* ''printf()''：将格式化数据写入'''stdout'''&lt;br /&gt;
* ''fprintf()'': 将格式化数据写入流&lt;br /&gt;
* ''sprintf()''：将格式化数据写入缓冲区&lt;br /&gt;
* ''snprintf()''：将格式化数据写入缓冲区，限制写入的最大字符数&lt;br /&gt;
* ''vprintf()'': 将格式化数据写入 '''stdout'''，使用一个 '''va_list''' 而不是  '''...'''&lt;br /&gt;
* ''vfprintf()''：将格式化数据写入流，使用一个 '''va_list''' 而不是  '''...'''&lt;br /&gt;
* ''vsprintf()''：将格式化数据写入缓冲区，使用一个 '''va_list''' 而不是  '''...'''&lt;br /&gt;
* ''vsnprintf()'': 将格式化的数据写入缓冲区，限制写入的最大字符，使用一个 '''va_list''' 而不是  '''...'''&lt;br /&gt;
&lt;br /&gt;
并且抽象。。。&lt;br /&gt;
* ''printf()'': Wraps over ''vprintf()''&lt;br /&gt;
* ''fprintf()'': Wraps over ''vfprintf()''&lt;br /&gt;
* ''sprintf()'': Wraps over ''vsprintf()''&lt;br /&gt;
* ''snprintf()'': Wraps over ''vsnprintf()''&lt;br /&gt;
* ''vprintf()'': Wraps over ''vfprintf()''&lt;br /&gt;
* ''vfprintf()'': Does the work!&lt;br /&gt;
* ''vsprintf()'': Wraps over ''vsnprintf()'' (with a magical number as limit).&lt;br /&gt;
* ''vsnprintf()'': Wraps over ''vfprintf()'' with ''fmemopen()''&lt;br /&gt;
&lt;br /&gt;
但是，嘿! 这是一个用户空间C库示例！ 是的，是这样的。 你很可能只提供一个 “printf()”，它可以完成 “vfprintf()” 的意图，但可以一次完成。 基本上，worker函数将在它必须打印的地方打印，直到找到一个“%”字符。 如果后跟另一个'''%'''，则会打印并处理后续内容。 如果后面跟着一个有效的说明符字符，则开始解析。 否则，字符将被打印出来并继续处理。 我们稍后将详细解释每一项的实现。&lt;br /&gt;
&lt;br /&gt;
== 常量定义 ==&lt;br /&gt;
让我们定义一些常量，稍后我们将大量使用这些常量&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define FLAG_LEFT  0x01 // The '-' flag&lt;br /&gt;
#define FLAG_SIGN  0x02 // The '+' flag&lt;br /&gt;
#define FLAG_SPACE 0x04 // The ' ' flag&lt;br /&gt;
#define FLAG_TYPE  0x08 // The '#' flag&lt;br /&gt;
#define FLAG_ZERO  0x10 // The '0' flag&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==通用占位符（General Recolection）==&lt;br /&gt;
一旦你在一个 '''%''' 之后找到了一些东西，你应该开始声明三个有符号变量:&lt;br /&gt;
&lt;br /&gt;
==示例实现==&lt;br /&gt;
[[User:A22347/Printf]]&lt;br /&gt;
&lt;br /&gt;
{{In Progress}}&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>