2022-11-04

用数组(array) 储存字符串(character string) 。 在该程序中, 用户输入的名被储存在数组中, 该数组占用内存中40个连续的字节, 每个字节储存一个字符值。

使用%s转换说明来处理字符串的输入和输出。 注意, 在scanf()中,name没有&前缀, 而weight有(稍后解释,&weight和name都是地址) 。

用C预处理器把字符常量DENSITY定义为62.4。

用C函数strlen()获取字符串的长度。

字符串介绍

字符串(character string) 是一个或多个字符的序列双引号不是字符串的一部分。 双引号仅告知编译器它括起来的是字符串, 正如单引号用于标识单个字符一样。

char类型数组和null字符

C语言没有专门用于储存字符串的变量类型, 字符串都被储存在char类型的数组中。 数组由连续的存储单元组成, 字符串中的字符被储存在相邻的存储单元中, 每个单元储存一个字符。

数组末尾位置的字符\0。 这是空字符(null character) , C语言用它标记字符串的结束。 空字符不是数字0, 它是非打印字符, 其ASCII码值是(或等价于)0。

C中的字符串一定以空字符结束, 这意味着数组的容量必须至少比待存储字符串中的字符数多1。数组是同类型数据元素的有序序列。

name后面的方括号表明这是一个数组, 方括号中的40表明该数组中的元素数量。 char表明每个元素的类型。

使用字符串

%s告诉printf()打印一个字符串。 %s出现了两次, 因为程序要打印两个字符串一个储存在name数组中; 一个由PRAISE来表示。

scanf()只读取了Angela Plains中的Angela, 它在遇到第1个空白(空格、 制表符或换行符) 时就不再读取输入。 scanf()在读到Angela和Plains之间的空格时就停止了。%s转换说明, scanf()只会读取字符串中的一个单词, 而不是一整句。

字符串和字符

字符串常量"x"和字符常量'x'不同。 区别之一在于'x'是基本类型(char), 而"x"是派生类型(char数组); 区别之二是"x"实际上由两个字符组成: 'x'和空字符\0

strlen()函数


string.h头文件包含多个与字符串相关的函数原型, 包括strlen()。 C 把函数库中相关的函数归为一类, 并为每类函数提供一个头文件。 例如, printf()和scanf()都隶属标准输入和输出函数, 使用stdio.h头文件。 string.h头文件中包含了strlen()函数和其他一些与字符串相关的函数(如拷贝字符串的函数和字符串查找函数)。两种方法处理很长的printf()语句。 第1种方法是将printf()语句分为两行(可以在参数之间断为两行, 但是不要在双引号中的字符串中间断开) ; 第 2 种方法是使用两个printf()语句打印一行内容, 只在第2条printf()语句中使用换行符(\n) 。

对于 PRAISE, 用 strlen()得出的也是字符串中的字符数(包括空格和标点符号) 。 然而, sizeof运算符给出的数更大, 因为它把字符串末尾不可见的空字符也计算在内。 该程序并未明确告诉计算机要给字符串预留多少空间, 所以它必须计算双引号内的字符数。

符的返回类型添加了%zd 转换说明, 这对于strlen()同样适用。

运算对象是类型时,圆括号必不可少, 但是对于特定量, 可有可无。对于类型, 应写成sizeof(char)或sizeof(float); 对于特定量, 可写成sizeof name或sizeof 6.28。

常量和C处理器

有时, 在程序中要使用常量。例如, 可以这样计算圆的周长:

circumference = 3.14159 * diameter;

 常量3.14159代表著名的常量pi(π) 。 在该例中, 输入实际值便可使用这个常量。 然而, 这种情况使用符号常量(symbolic constant) 会更好。circumference = pi * diameter;

符号常量常量名比数字表达的信息更多。假设程序中的多处使用一个常量, 有时需要改变它的值。 毕竟,税率通常是浮动的。 如果程序使用符号常量, 则只需更改符号常量的定义,不用在程序中查找使用常量的地方, 然后逐一修改。

如何创建符号常量?

声明一个变量, 然后将该变量设置为所需的常量。

float taxrate;

taxrate = 0.015;

预处理器也可用来定义常量。 只需在程序顶部添加#define TAXRATE 0.015编译程序时, 程序中所有的TAXRATE都会被替换成0.015。这一过程被称为编译时替换(compile-time substitution) 。 在运行程序时, 程序中所有的替换均已完成。这样定义的常量也称为明示常量(manifest constant)。

还有一个不常用的命名约定, 即在名称前带c_或k_前缀来表示常量(如, c_level或k_line)。

符号常量的命名规则与变量相同。 可以使用大小写字母、 数字和下划线字符, 首字符不能为数字。

printf()语句中的%1.2f表明, 结果被四舍五入为两位小数输出。

#define指令还可定义字符和字符串常量。 前者使用单引号, 后者使用双引号。

#define BEEP '\a'

#define TEE 'T'

#define ESC '\033'

#define OOPS "Now you have done it!"

符号常量名后面的内容被用来替换符号常量。

const限定符

C90标准新增了const关键字, 用于限定一个变量为只读 。

const int MONTHS = 12; // MONTHS在程序中不可更改, 值为12

这使得MONTHS成为一个只读值。 也就是说, 可以在计算中使用MONTHS, 可以打印MONTHS, 但是不能更改MONTHS的值。 const用起来比#define更灵活。

明示常量

C头文件limits.h和float.h分别提供了与整数类型和浮点类型大小限制相关的详细信息。 每个头文件都定义了一系列供实现使用的明示常量 [3]。 例如, limits.h头文件包含以下类似的代码:

#define INT_MAX +32767

#define INT_MIN -32768

这些明示常量代表int类型可表示的最大值和最小值。 如果系统使用32位的int, 该头文件会为这些明示常量提供不同的值。

在程序中包含limits.h头文件, 就可编写代码:printf("Maximum int value on this system = %d\n", INT_MAX);

如果系统使用4字节的int, limits.h头文件会提供符合4字节int的INT_MAX和INT_MIN。

float.h头文件中也定义一些明示常量, 如FLT_DIG和DBL_DIG, 分别表示float类型和double类型的有效数字位数。

printf()和scanf()

printf()函数和scanf()函数能让用户可以与程序交流, 它们是输入/输出函数, 或简称为I/O函数。过去, 这些函数和C库的一些其他函数一样, 并不是C语言定义的一部分。后来, 考虑到兼容性的问题, 各编译器都提供不同版本的printf()和scanf()。

虽然printf()是输出函数, scanf()是输入函数, 但是它们的工作原理几乎相同。

printf()函数

请求printf()函数打印数据的指令要与待打印数据的类型相匹配。 例如,打印整数时使用%d, 打印字符时使用%c。 这些符号被称为转换说明(conversion specification), 它们指定了如何把数据转换成可显示的形式。ANSI C标准为printf()提供的转换说明

使用printf()

printf()函数的格式:printf( 格式字符串, 待打印项1, 待打印项2,...);

待打印项1、 待打印项2等都是要打印的项。 它们可以是变量、 常量, 甚至是在打印之前先要计算的表达式。格式字符串应包含每个待打印项对应的转换说明。

printf("The %d contestants ate %f berry pies.\n", number,pies);

格式字符串是双引号括起来的内容。 上面语句的格式字符串包含了两个待打印项number和poes对应的两个转换说明。

格式字符串包含两种形式不同的信息:

实际要打印的字符;

转换说明。

格式字符串中的转换说明一定要与后面的每个项相匹配

printf("Farewell! thou art too dear for my possessing,\n");

printf("%c%d\n", '$', 2 * cost);

第2条语句, 待打印列表的第1个项是一个字符常量, 不是变量; 第2个项是一个乘法表达式。 这说明printf()使用的是值, 无论是变量、 常量还是表达式的值。

printf()函数使用%符号来标识转换说明, 因此打印%符号就成了个问题。 如果单独使用一个%符号, 编译器会认为漏掉了一个转换字符。 解决方法很简单, 使用两个%符号就行了。

pc = 2*6;

printf("Only %d%% of Sally's gribbles were edible.\n", pc);

下面是输出结果:

Only 12% of Sally's gribbles were edible.

printf()的转换说明修饰符

在%和转换字符之间插入修饰符可修饰基本的转换说明。表4.4和表4.5列出可作为修饰符的合法字符。 如果要插入多个字符, 其书写顺序应该与表4.4中列出的顺序相同。 不是所有的组合都可行。 表中有些字符是C99新增的, 如果编译器不支持C99, 则可能不支持表中的所有项。







sizeof 运算符以字节为单位返回类型或值的大小。 这应该是某种形式的整数, 但是标准只规定了该值是无符号整数。 在不同的实现中, 它可以是unsigned int、 unsigned long甚至是unsigned long long。如果要用printf()函数显示sizeof表达式, 根据不同系统, 可能使用%u、 %lu或%llu。

stddef.h头文件(在包含stdio.h头文件时已包含其中) 把size_t定义成系统使用sizeof返回的类型, 这被称为底层类型(underlying type)intf()使用z修饰符表示打印相应的类型。 同样, C还定义了ptrdiff_t类型和t修饰符来表示系统使用的两个地址差值的底层有符号整数类型。

float参数的转换

浮点类型, 有用于double和long double类型的转换说明, 却没有float类型的。在K&R C中, 表达式或参数中的float类型值会被自动转换成double类型。ANSI C不会把float自动转换成double。 然而, 为保护大量假设float类型的参数被自动转换成double的现有程序,printf()函数中所有float类型的参数(对未使用显式原型的所有C函数都有效) 仍自动转换成double类型。

第1个转换说明%d不带任何修饰符, 其对应的输出结果与带整数字段宽度的转换说明的输出结果相同。 在默认情况下, 没有任何修饰符的转换说明, 就是这样的打印结果。第2个转换说明是%2d, 其对应的输出结果应该是 2 字段宽度。 因为待打印的整数有 3 位数字, 所以字段宽度自动扩大以符合整数的长度。 第 3个转换说明是%10d, 其对应的输出结果有10个空格宽度, 实际上在两个星号之间有7个空格和3位数字, 并且数字位于字段的右侧。最后一个转换说明是%-10d, 其对应的输出结果同样是 10 个空格宽度, -标记说明打印的数字位于字段的左侧。

第1个转换说明是%f。 在这种情况下, 字段宽度和小数点后面的位数均为系统默认设置, 即字段宽度是容纳带打印数字所需的位数和小数点后打印6位数字

第2个转换说明是%e。 默认情况下, 编译器在小数点的左侧打印1个数字, 在小数点的右侧打印6个数字。

第7个转换说明中包含了+标记, 这使得打印的值前面多了一个代数符号(+) 。 0标记使得打印的值前面以0填充以满足字段要求。转换说明%010.2f的第1个0是标记, 句点(.) 之前、 标记之后的数字(本例为10)是指定的字段宽度。

第一行输出1f是十六进制数, 等于十进制数31。 第1行printf()语句中, 根据%x打印出1f, %F打印出1F, %#x打印出0x1f。

第 2 行输出演示了如何在转换说明中用空格在输出的正值前面生成前导空格, 负值前面不产生前导空格。

第3行输出演示了如何在整型格式中使用精度(%5.3d) 生成足够的前导0以满足最小位数的要求 。 然而, 使用0标记会使得编译器用前导0填充满整个字段宽度。 最后, 如果0标记和精度一起出现, 0标记会被忽略。

第1个转换说明是%2s, 但是字段被扩大为可容纳字符串中的所有字符。 还需注意, 精度限制了待打印字符的个数。 .5告诉printf()只打印5个字符。 另外, -标记使得文本左对齐输出。

转换说明的意义

转换说明把以二进制格式储存在计算机中的值转换成一系列字符(字符串) 以便于显示。%d转换说明将其转换成字符7和6, 并显示为76; %x转换说明把相同的值(01001100) 转换成十六进制记数法4c; %c转换说明把01001100转换成字符L。

%d的意思是“把给定的值翻译成十进制整数文本并打印出来”。

转换不匹配

如果要打印一个int类型的值, 可以使用%d、 %x或%o。 这些转换说明都可用于打印int类型的值, 其区别在于它们分别表示一个值的形式不同。 类似地, 打印double类型的值时, 可使用%f、 %e或%g。

第1行, num变量对应的转换说明%hd和%hu输出的结果都是336。第2行mnum变量对应的转换说明%u(无符号) 输出的结果却为65200, 并非期望的336。

short int的大小是2字节;其次, 系统使用二进制补码来表示有符号整数。当printf()使用%c打印336时,

它只会查看储存336的2字节中的后1字节。 这种截断(见图4.8) 相当于用一个整数除以只保留其余数。

用%hd转换说明打印时, printf()只使用最后2个字节。

%e转换说明没有把整数转换成浮点数。%e转换说明让printf()函数认为待打印的值是double类型(本系统中double为8字节) 。当printf()查看n3(本系统中是4字节的值) 时, 除了查看n3的4字节外, 还会查看查看n3相邻的4字节, 共8字节单元。接着, 它将8字节单元中的位组合解释成浮点数(如, 把一部分位组合解释成指数) 。 因此, 即使n3的位数正确, 根据%e转换说明和%ld转换说明解释出来的值也不同。 最终得到的结果是无意义的值。

第一行float类型的值作为printf()参数时会被转换成double类型。 在本系统中, float是4字节, 但是为了printf()能正确地显示该值, n1被扩成8字节。

第二行只要使用正确的转换说明, printf()就可以打印n3和n4

第3行输出显示, 如果printf()语句有其他不匹配的地方, 即使用对了转换说明也会生成虚假的结果。 用%ld转换说明打印浮点数会失败。

参数传递

printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);

该调用告诉计算机把变量n1、 n2、 、 n3和n4的值传递给程序。 这是一种常见的参数传递方式。 程序把传入的值放入被称为栈(stack) 的内存区域。计算机根据变量类型(不是根据转换说明) 把这些值放入栈中。

n1被储存在栈中, 占8字节(float类型被转换成double类型) 。 同样, n2也在栈中占8字节, 而n3和n4在栈中分别占4字节。 然后, 控制转到printf()函数。 该函数根据转换说明(不是根据变量类型) 从栈中读取值。%ld转换说明表明printf()应该读取4字节, 所以printf()读取栈中的前4字节作为第1个值。这是n1的前半部分, 将被解释成一个long类型的整数。 根据下一个%ld转换说明, printf()再读取4字节, 这是n1的后半部分, 将被解释成第2个long类型的整数

printf()的返回值

大部分C函数都有一个返回值, 这是函数计算并返回给主调程序(calling program)的值。例如, C库包含一个sqrt()函数, 接受一个数作为参数, 并返回该数的平方根。 可以把返回值赋给变量, 也可以用于计算, 还可以作为参数传递。 总之, 可以把返回值像其他值一样使用。printf()函数也有一个返回值, 它返回打印字符的个数。 如果有输出错误,printf()则返回一个负值(printf()的旧版本会返回不同的值) 。

printf()的返回值是其打印输出功能的附带用途,在检查输出错误时可能会用到(如, 在写入文件时很常用) 。

程序用rv = printf(...);的形式把printf()的返回值赋给rv。 因此, 该语句执行了两项任务: 打印信息和给变量赋值。

打印较长的字符串

printf("The printf() function printed %d characters.\n",rv);该语句在逗号和 rv之间断行。不能在双引号括起来的字符串中间断行。

C编译器会报错: 字符串常量中有非法字符。 在字符串中, 可以使用\n

printf("The printf() function printed %d characters.\n", rv);

来表示换行字符, 但是不能通过按下Enter(或Return) 键产生实际的换行符。

给字符串断行有3种方法

方法1: 使用多个printf()语句。 因为第1个字符串没有以\n字符结束, 所以第2个字符串紧跟第1个字符串末尾输出。

方法2: 用反斜杠(\) 和Enter(或Return) 键组合来断行。 这使得光标移至下一行, 而且字符串中不会包含换行符。 其效果是在下一行继续输出。但是, 下一行代码必须和程序清单中的代码一样从最左边开始。 如果缩进该行, 比如缩进5个空格, 那么这5个空格就会成为字符串的一部分。

ANSI C引入的字符串连接。 在两个用双引号括起来的字符串之间用空白隔开, C编译器会把多个字符串看作是一个字符串。

使用scanf()

C库包含了多个输入函数, scanf()是最通用的一个, 因为它可以读取不同格式的数据。scanf()把输入的字符串转换成整数、 浮点数、 字符或字符串, 而printf()正好与它相反, 把整数、 浮点数、 字符和字符串转换成显示在屏幕上的文本。

scanf()和 printf()类似, 也使用格式字符串和参数列表。 scanf()中的格式字符串表明字符输入流的目标数据类型。 两个函数主要的区别在参数列表中。 printf()函数使用变量、 常量和表达式, 而scanf()函数使用指向变量的指针。

如果用scanf()读取基本变量类型的值, 在变量名前加上一个&;

如果用scanf()把字符串读入字符数组中, 不要使用&。

scanf()函数使用空白(换行符、 制表符和空格) 把输入分成多个字段。在依次把转换说明和字段匹配时跳过空白。

scanf()函数所用的转换说明与printf()函数几乎相同。 主要的区别是, 对于float类型和double类型, printf()都使用%f、 %e、 %E、 %g和%G转换说明。 而scanf()只把它们用于float类型, 对于double类型时要使用l修饰符。

如果要使用多个修饰符, 必须按表4.7所列的顺序书写

使用转换说明比较复杂, 而且这些表中还省略了一些特性。省略的主要特性是, 从高度格式化源中读取选定数据, 如穿孔卡或其他数据记录。

从scanf()角度看输入

假设scanf()根据一个%d转换说明读取一个整数。 scanf()函数每次读取一个字符, 跳过所有的空白字符, 直至遇到第1个非空白字符才开始读取。如果找到一个数字或符号, 它便保存该字符, 并读取下一个字符。如果下一个字符是数字, 它便保存该数字并读取下一个字符。 scanf()不断地读取和保存字符, 直至遇到非数字字符。程序在下一次读取输入时, 首先读到的是上一次读取丢弃的非数字字符。scanf()计算已读取数字(可能还有符号) 相应的数值, 并将计算后的值放入指定的变量中。

如果使用%s 转换说明, scanf()会读取除空白以外的所有字符。 scanf()跳过空白开始读取第 1 个非空白字符, 并保存非空白字符直到再次遇到空白。scanf()根据%s 转换说明读取一个单词, 即不包含空白字符的字符串。 如果使用字段宽度, scanf()在字段末尾或第1个空白字符处停止读取。

当scanf()把字符串放进指定数组中时, 它会在字符序列的末尾加上'\0', 让数组中的内容成为一个C字符串。

格式字符串中的普通字符

scanf()函数允许把普通字符放在格式字符串中。 除空格字符外的普通字符必须与输入字符串严格匹配。假设在两个转换说明中添加一个逗号:

scanf("%d,%d", &n, &m);

scanf()函数将其解释成: 用户将输入一个数字、 一个逗号, 然后再输入一个数字。 也就是说, 用户必须像下面这样进行输入两个整数:

88,121

格式字符串中, %d后面紧跟逗号, 所以必须在输入88后再输入一个逗号。 但是, 由于scanf()会跳过整数前面的空白, 所以两种输入方式都可以:

88, 121

和 88,121

格式字符串中的空白意味着跳过下一个输入项前面的所有空白。 “所有空白”的概念包括没有空格的特殊情况。

除了%c, 其他转换说明都会自动跳过待输入值前面所有的空白。 因此, scanf("%d%d", &n, &m)与scanf("%d %d", &n, &m)的行为相同。 对于%c, 在格式字符串中添加一个空格字符会有所不同。如果把%c放在格式字符串中的空格前面, scanf()便会跳过空格, 从第1个非空白字符开始读取。 也就是说, scanf("%c", &ch)从输入中的第1个字符开始读取, 而scanf(" %c", &ch)则从第1个非空白字符开始读取。

scanf()的返回值

scanf()函数返回成功读取的项数。 如果没有读取任何项, 且需要读取一个数字而用户却输入一个非数值字符串, scanf()便返回0。 当scanf()检测到“文件结尾”时, 会返回EOF(EOF是stdio.h中定义的特殊值, 通常用#define指令把EOF定义为-1) 。

printf()和scanf()的*修饰符

printf()和scanf()都可以使用*修饰符来修改转换说明的含义。 但是, 它们的用法不太一样。

printf()的*修饰符。

如果不想预先指定字段宽度, 希望通过程序来指定, 那么可以用*修饰符代替字段宽度。 但还是要用一个参数告诉函数, 字段宽度应该是多少。也就是说, 如果转换说明是%*d, 那么参数列表中应包含*和 d对应的值。 这个技巧也可用于浮点值指定精度和字段宽度。

变量width提供字段宽度, number是待打印的数字。 因为转换说明中*在d的前面, 所以在printf()的参数列表中, width在number的前面。 同样, width和precision提供打印weight的格式化信息。

首先输入6, 因此6是程序使用的字段宽度。 类似地, 接下来输入8和3, 说明字段宽度是8, 小数点后面显示3位数字。程序应根据weight的值来决定这些变量的值。

跳过两个整数, 把第3个整数拷贝给n。

printf的用法提示

想把数据打印成列, 指定固定字段宽度很有用。 因为默认的字段宽度是待打印数字的宽度, 如果同一列中打印的数字位数不同

printf("%d %d %d\n", val1, val2, val3);

打印出来的数字可能参差不齐。假设执行3次printf()语句, 输入不同的变量, 其输出可能是这样:

12 234 1222

4 5 23

22334 2322 10001

使用足够大的固定字段宽度可以让输出整齐美观。

printf("%9d %9d %9d\n", val1, val2, val3);

上面的输出将变成:

12 234 1222

4 5 23

22334 2322 10001

两个转换说明中间插入一个空白字符, 可以确保即使一个数字溢出了自己的字段, 下一个数字也不会紧跟该数字一起输出(这样两个数字看起来像是一个数字) 。 这是因为格式字符串中的普通字符(包括空格) 会被打印出来。

如果要在文字中嵌入一个数字, 通常指定一个小于或等于该数字宽度的字段会比较方便。

本地化设置

printf()和 scanf()都没有提供逗号的转换说明。 因此C程序可以选择特定的本地化设置。 例如, 如果指定了荷兰语言环境, printf()和scanf()在显示和读取浮点值时会使用本地惯例(在这种情况下, 用逗号代替点分隔浮点值的整数部分和小数部分) 。 另外, 一旦指定了环境, 便可在代码的数字中使用逗号:

double pi = 3,14159; // 荷兰本地化设置

C标准有两个本地化设置: "C"和""(空字符串) 。 默认情况下, 程序使用"C"本地化设置, 基本上符合美国的用法习惯。 而""本地化设置可以替换当前系统中使用的本地语言环境。

关键字概念

C语言用char类型表示单个字符, 用字符串表示字符序列。 字符常量是一种字符串形式, 即用双引号把字符括起来: "Good luck, my friend"。 可以把字符串储存在字符数组(由内存中相邻的字节组成) 中。 字符串, 无论是表示成字符常量还是储存在字符数组中, 都以一个叫做空字符的隐藏字符结尾。

程序中, 最好用#define 定义数值常量, 用 const 关键字声明的变量为只读变量。 在程序中使用符号常量(明示常量) , 提高了程序的可读性和可维护性。

C 语言的标准输入函数(scanf()) 和标准输出函数(printf()) 都使用一种系统。 在该系统中, 第1个参数中的转换说明必须与后续参数中的值相匹配。scanf(),一定要记得在变量名前加上地址运算符(&) 。

空白字符(制表符、 空格和换行符) 在 scanf()处理输入时起着至关重要的作用。 除了%c 模式(读取下一个字符) , scanf()在读取输入时会跳过非空白字符前的所有空白字符, 然后一直读取字符, 直至遇到空白字符或与正在读取字符不匹配的字符。

本章小结

字符串是一系列被视为一个处理单元的字符。 在C语言中, 字符串是以空字符(ASCII码是0) 结尾的一系列字符。 可以把字符串储存在字符数组中。 数组是一系列同类型的项或元素。下面声明了一个名为name、 有30个char类型元素的数组:

char name[30];

要确保有足够多的元素来储存整个字符串(包括空字符) 。

字符串常量是用双引号括起来的字符序列, 如: "This is an example of a string"。

scanf()函数(声明在string.h头文件中) 可用于获得字符串的长度(末尾的空字符不计算在内) 。 scanf()函数中的转换说明是%s时, 可读取一个单词。

C预处理器为预处理器指令(以#符号开始) 查找源代码程序, 并在开始编译程序之前处理它们。 处理器根据#include指令把另一个文件中的内容添加到该指令所在的位置。 #define指令可以创建明示常量(符号常量) , 即代表常量的符号。 limits.h和float.h头文件用#define定义了一组表示整型和浮点型不同属性的符号常量。 另外, 还可以使用const限定符创建定义后就不能修改的变量。

printf()和scanf()函数对输入和输出提供多种支持。 两个函数都使用格式字符串, 其中包含的转换说明表明待读取或待打印数据项的数量和类型。 另外, 可以使用转换说明控制输出的外观: 字段宽度、 小数位和字段内的布局。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容