您的位置  > 互联网

高级用法:解析转义字符和执行格式化文本操作函数的用法

该函数源自C语言标准库中的同名函数。 该函数用于在C语言中创建格式化字符串,使用非常频繁。 作为一种高级编程语言,它借鉴了 C 和其他编程语言的许多功能和命名约定。 在 中,该函数有两个主要用途:解析转义字符和执行格式化文本操作。 下面我们分别介绍一下这两种用途。

基本用法:解析转义字符

上一章解释函数时,我们介绍了转义字符的概念。 转义字符是一类特殊字符,用于表示文本中无法直接键入的特定字符。 例如,转义字符\n代表换行符,\t代表水平制表符,\r代表回车符等。

在 中,函数可以解析文本中的转义字符,即将其转换为相应的特定字符。 下面我们直接引用官方文档来介绍这个用法:

str = () 转换时转义字符序列,例如\n和\t。 它返回所有其他字符不变。 指定为字符向量或字符串标量。

这种用法简单明了。 我们来看两个具体的例子:

另外,官方文档中还附加了一句:如果输入参数表示的文本包含格式化运算符,则在输出结果中将丢弃该字符以及后续所有字符。 这句话中出现了一个新的概念:格式化运算符,我们将在下面的高级用法中向大家介绍。

高级用法:格式化文本操作

函数的高级用法用于将数据转换为特定格式的文本。 这种格式化操作可以让我们通过非常具体的方式来控制文本的渲染,包括数字精度、对齐方式、字段宽度等。这个功能在生成报表、显示数据等场景中尤为重要,因为它可以保证准确性和一致性信息,同时使文本输出更加整洁和可读。

我们首先引用官方文档来介绍一下如何使用函数来格式化文本:

str =(,A1,...,An) 使用指定的格式化运算符格式化数组 A1,...,An 中的数据,并在 str 中返回结果文本。 该函数按列顺序格式化 A1,...,An 中的值。 如果是字符串,则输出str也是字符串; 否则,str 是字符向量。 (注:所谓格式化可以理解为将格式化操作符替换为A1,...,An)

在此用法中, 是表示输出文本格式的核心参数。 它可以包含格式化运算符、普通文本和特殊字符(例如转义字符),其数据类型是字符向量或字符串标量。 A1, ..., An 是一组用于格式化的数字、字符或字符串数​​组,可以有一个或多个。

上面的介绍中出现了一个重要的概念:格式化运算符。 格式运算符是该函数的核心。 它以百分号 % 开头,并且必须以转换字符结尾。 在这之间,我们还可以指定标识符、标志、字段宽度、精度和子类型,这些都是可选参数。

官网上有一个最完整的格式化运算符示例:'%3$0-12.4bu',细分如下:

虽然上面显示的格式化运算符的示例很全面,但对于初学者来说可能过于复杂,并且在实际应用中并不经常使用。 因此,在本书中我们将重点讨论更常见、更容易理解的格式化运算符的用法。 这样做的目的是为了让知识点更贴近实际应用,也方便大家快速掌握中文文本格式化的核心技能。

另外,在上面的介绍中,我们提到了格式化操作符的多个组成部分。 为了更深入地了解这些部分的作用,我们将介绍它们各自的功能和用法。

1、转换字符(格式化操作符必须以转换字符结尾)

下面我们介绍一些最常用的转换字符:d或i、f、e和s。 这五个转换字符是文本格式化应用中最常见的,掌握它们的用法可以满足大多数格式化文本的需求。

(1)d或i:这两个转换字符用于格式化整数

(2) 转换字符f:以定点表示法格式化数据

从上面的例子可以看出,直接使用'%f'会保留小数点后6位。 如果需要控制保留的小数位数,则需要与可选的“精度”参数结合使用。 例如,保留三位小数的格式运算符是“%.3f”,保留五位小数的格式运算符是“%.5f”。 我们稍后会详细介绍。

(3) 转换字符e:以科学记数法格式化数据

从结果可以看出,使用'%e'表示科学计数法时,会默认保留小数点后6位。 我们还可以将它与可选的“精度”参数结合使用。 稍后我们将向您展示示例。

(4) 转换字符s:格式化文本数据

以上是几个常用转换字符的介绍。 您可以查看该功能的帮助文档。 帮助文档对u、o、x、g、c等转换字符有较多介绍,使用频率较低。

这里额外提供三个知识点,帮助您更好地理解函数的使用:

知识点1:错误的格式化运算符

使用函数时,选择正确的格式化运算符至关重要。 错误的格式化运算符可能会导致输出不符合预期。 例如,“%p”不是标准格式化运算符,使用它会导致文本的后续部分被意外丢弃。

事实上,函数可以有第二个返回值,可以如下使用:如果操作失败,[str,] = (,A1,...,An) 将返回一条错误消息作为字符向量。 否则就是空的。

知识点2:多元素数组的处理

在上面显示的示例中,我们重点关注如何使用函数来格式化单个数值或文本。 但根据官方文档中的描述:str = (, A1, ..., An) 使用指定的格式化运算符对数组 A1, ..., An 中的数据进行格式化。 这意味着 A1, ..., An 可以是具有多个元素的向量或矩阵。 当我们使用向量或矩阵作为函数的输入时,该函数按线性索引顺序格式化。 让我们通过两个简单的例子来理解这一点:

让我们看下面两个更复杂的例子。 当参数中包含多个格式化运算符时,将依次使用数组参数中的元素进行替换。

知识点三:特殊字符

使用函数时,正确处理特殊字符至关重要。 以下是处理一些常见特殊字符的示例:

2. 准确度(可选)

精度是格式化运算符中的核心选项,用于控制数字格式化为文本时的精确程度。 主要用在%f(定点表示法)和%e(科学计数法)中,可以用来控制小数点右边的位数。

例如:%.nf 和 %.ne 格式化运算符可以指定小数点后保留 n 位数字。 我们举几个例子:

虽然设置精度看起来是一项简单的任务,但它在数据呈现中起着至关重要的作用。

在实际应用中,适当的精度设置有助于保证数据的准确传达,避免可能的误解或数据丢失。 例如,在财务报告中,小数位数过多可能会导致读者阅读困难,而在科学研究中,小数位数较少可能会影响结果的准确性。 因此,理解并正确设置精度是数据处理和表示的关键技能。

3. 字段宽度(可选)

字段宽度是格式化操作符中的一个重要选项,用于控制文本输出的布局。 具体来说,它定义了每个格式化字段应占用的最小字符数。 在函数中,字段宽度由百分号 % 和精度选项(如果存在精度选项)之间的数字指定。

如果实际值的字符数少于指定的字段宽度,则使用空格填充左侧的剩余空间。 这种填充可确保每个字段至少占据指定宽度的空间,使输出文本在视觉上更加统一和整洁。

让我们看几个指定字段宽度的示例:

前两个例子比较容易理解,但最后一个例子比较特殊:在这个例子中,字段宽度设置为3,实际值1234占用4个字符。 在这种情况下,该函数不会截断或省略实际值,而是保留完整值。 字段宽度的主要目的是保证文本至少占据设定宽度的空间。 如果实际值超过这个宽度,就会完整显示。

这种格式允许输出文本即使在值长度不一致的情况下也能保持整齐,从而大大提高信息的可读性和专业感。 例如,在创建成绩电子表格或财务报告时,使用字段宽度来确保所有数据列对齐可以使整个文档看起来更清晰、更有条理。

4. 标志(可选)

在格式化运算符中,标志是可选选项,用于进一步调整输出文本的布局。 通过使用不同的标志,我们可以控制值和文本的对齐、符号的显示等。

使用时,flag参数需要放在百分号%和字段宽度之间(如果有字段宽度)。 下面我们介绍三种常见的标志及其使用方法:

(1)'-':左对齐符号(其实就是键盘上的减号)

“-”标志确保文本或数值在指定的字段宽度内左对齐,其余字符用空格填充。

(2) '+':始终显示符号(实际上是键盘上的加号)

“+”标志用于确保该值前面有一个符号(+ 或 -),无论它是正数还是负数。 当您需要清楚地区分正值和负值时,这非常有用。

另外,我们可以同时设置多个标志,并且标志出现的顺序对结果没有影响。 例如:

(3) '0':在值前补零以填充字段宽度

默认情况下,空格用于填充指定的字段宽度。 然而,使用“0”标志允许我们用数字 0 填充它。

5. 标识符(可选,很少使用)

标识符是格式化运算符的一项高级功能,用于指定函数输入参数的顺序。 虽然在日常使用中不太常见,但它在某些情况下可以提供额外的灵活性,特别是当您需要调整输出顺序或重复使用某些参数时。

在函数中,标识符以'n$'的形式实现,其中'n'表示函数调用中其他输入参数的位置。 这种方法允许我们在格式化文本时重新排列或重用参数,而无需更改输入参数的实际顺序。

使用时,标识符参数需要放在百分号%和标志之间(如果标志存在)。 让我们看下面两个例子:

需要注意的是,如果输入参数是包含多个元素的数组,则不能使用标识符来指定数组中元素的顺序。 你可以自己尝试一下。

6. 子类型(可选,很少使用)

子类型化是格式化运算符中高度专业化的功能。 主要用于显示不同精度数字系统(如八进制、十进制、十六进制)的浮点数。 子类型紧接在转换字符之前和其他可选参数之后出现。 我们看一个具体的例子来了解它的用法:

在此示例中,“b”表示双精度子类型,“x”是表示十六进制的转换字符。 它们一起用于将 pi 转换为其双精度十六进制表示形式。 这种表示形式并不是用于日常的数值读取,而是为了满足底层编程调试或者特定的科学计算需求,例如处理硬件驱动、嵌入式编程、操作系统底层调试等。

除了上面的例子之外,该函数还提供了其他子类型的表示方法(大家有印象即可,不需要刻意去记住):

'%bo':将浮点数表示为双精度八进制; '%bu':将浮点数表示为双精度小数; '%tx':将浮点数表示为单精度十六进制; '%to': 将浮点数表示为单精度十六进制浮点数表示为单精度八进制; '%tu':将浮点数表示为单精度小数。

介绍完函数的使用后,我们将通过两个例子来帮助您更好地理解其在实际编程中的应用。

示例 1:构造所有可能的生日

在某些应用场景中,我们可能需要构造一个包含所有可能生日的列表。 例如,在统计分析或数据模拟中,可能需要对每天的数据进行处理。 本示例演示如何构造一个包含所有可能生日的字符串数组(考虑到闰年,总共 366 天)。 每个生日均以“mmdd”格式构建,确保月份和日期部分均为两位数。 例如,“0115”表示 1 月 15 日,“0803”表示 8 月 3 日。 (本题摘自上一章课后练习提高篇Q7)

在这段代码中,我们首先定义月份以及每个月的天数; 接下来,我们使用双层循环来循环每个月的每一天,并使用函数将每个日期格式化为“mmdd”格式,格式化后的日期存储在字符串数组S中; 最后,我们输出 S,其中包含按日期顺序排列的所有生日。

示例2:输出二分查找法的中间计算结果

该问题改编自第 4 章 4.2.3 节中的示例问题。 原问题如下图所示:

通过上面的例子,我们详细讨论了二分查找方法的原理和实现方法,验证了该方法在解决零函数问题时的有效性和效率。 二分查找法的本质是不断缩小搜索区间,逐渐逼近目标值,直至达到预设的精度要求。 然而,在实际的编程实现过程中,我们不仅需要关心算法的最终结果,还需要关注算法的执行过程,尤其是在调试阶段或者分析算法性能时。 为此,实时监控算法的执行细节就显得尤为重要。

在二分查找方法的实现中,我们通常关注以下关键信息:

迭代次数:显示当前的迭代次数,帮助我们了解算法的收敛速度。

当前间隔:显示当前搜索间隔,让我们知道零点可能的范围。

区间中点:即当前迭代的零点估计,是算法逼近真实零点的媒介。

函数值:中点处的函数值,用于判断是否接近于零。

借助函数,我们可以将这些信息组织成特定的格式,使输出内容丰富、美观、易于理解。