Cprogramming 简明教程
Format Specifiers in C
C 中的格式说明符是在格式化控制台 IO 函数(比如 printf() 和 scanf())和格式化文件 IO 函数(比如 fprintf() 和 fscanf())中使用的特定特殊符号。
格式说明符由一个或多个字母数字字符组成的预定义序列加上 % 符号构成。例如,%d、%s、%f、%lf 等等是 C 中使用的一些格式说明符。
Why Do We Use Format Specifiers in C?
CPU 以流的方式执行输入和输出设备的 IO 操作。通过标准输入流从标准输入设备(例如,键盘)读取的数据称为 stdin 。类似地,通过标准输出设备发送到标准输出的(即计算机显示屏)数据称为 stdout 。
计算机以文本形式从流接收数据,但你可能想把它解析成不同数据类型的变量,比如 int、float 或字符串。类似地,存储在 int、float 或 char 变量中的数据必须以文本格式发送到输出流。格式说明符符号正是出于这个目的而使用的。
Format Specifiers in printf() Function
printf() 函数是使用最广泛的标准输出函数,在 stdio.h 头文件中定义。printf() 函数的原型如下:
int printf(format_string, expr1, expr2, . . );
这个函数的第一个参数是一个穿插着一个或多个格式说明符的字符串。第一个参数后面可以有一个或多个表达式作为参数。编译器用每个格式说明符替换它相继表达式的值。然后结果格式化字符串被传递到输出流。
Types of Format Specifiers
ANSI C 定义了许多格式说明符。下表列出了不同的说明符及其用途:
Format Specifier |
Type |
%c |
Character |
%d |
Signed integer |
%e or %E |
Scientific notation of floats |
%f |
Float values |
%g or %G |
与 %e 或 %E 类似 |
%hi |
Signed integer (short) |
%hu |
Unsigned Integer (short) |
%i |
Unsigned integer |
%l 或 %ld 或 %li |
Long |
%lf |
Double |
%Lf |
Long double |
%lu |
无符号int 或无符号 long |
%lli or %lld |
Long long |
%llu |
Unsigned long long |
%o |
Octal representation |
%p |
Pointer |
%s |
String |
%u |
Unsigned int |
%x or %X |
Hexadecimal representation |
-
减号 ( − ) 表示左对齐。
-
% 后的一个数字指定最小字段宽度。如果一个字符串小于宽度,它将用空格填充。
-
一个句点 ( . ) 用于分隔域宽和精度。
Integer Format Specifiers
C 使用 %d 表示带符号整数, %i 表示无符号整数, %ld 或 %li 表示长整数, %o 或 %O 表示八进制表示, %x 或 %X 表示整数的十六进制表示。
Example
以下示例突出显示了在 C 中如何使用整数格式说明符 −
#include <stdio.h>
int main(){
int num = 20;
printf("Signed integer: %d\n", num);
printf("Unsigned integer: %i\n", num);
printf("Long integer: %ld\n", num);
printf("Octal integer: %o\n", num);
printf("Hexadecimal integer: %x\n", num);
return 0;
}
当你运行这段代码时,它将产生以下输出:
Signed integer: 20
Unsigned integer: 20
Long integer: 20
Octal integer: 24
Hexadecimal integer: 14
Floating-point Formats
C 使用 %f 格式说明符表示单精度浮点数, %lf 表示双精度, %Lf 表示长双精度数。C 使用 %e 或 %E 说明符符号来表示科学记数法的浮点数。
您可以以小数点后位数的形式指定宽度和精度。例如,要将数字的宽度指定为 4 位,小数点后 2 位,请使用 %4.2f 表单。
Example
请看以下示例:
#include <stdio.h>
int main(){
float num = 5.347;
printf("float: %f\n", num);
printf("double: %lf\n", num);
printf("Scientific notation: %e\n", num);
printf("width and precision: %4.2f\n", num);
return 0;
}
运行此代码,您将获得以下输出−
float: 5.347000
double: 5.347000
Scientific notation: 5.347000e+000
width and precision: 5.35
String Formats
C 中的 char 数据类型实际上是 int 数据类型的子集。因此,带有 %c 格式说明符的 char 变量对应于单引号中的字符。另一方面,如果您使用 %d 说明符,则 char 变量将格式化为其 ASCII 值。
在 C 中,字符串是 char 数据的数组。C 使用 %s 说明符来显示 char 数组。
Format Specifiers in File IO Functions
stdio.h 库为磁盘文件定义了函数 fscanf() 和 fprintf() ,用于格式化 IO,而不是标准输入/输出流。
Example 1
以下代码以写入模式打开一个文件,并将其中的三个变量的值保存到该文件中。
#include <stdio.h>
int main(){
int x,y,z;
FILE *fp = fopen("test.txt","w");
x = 10; y = 20; z = 30;
fprintf(fp, "%d, %d, %d", x,y,z);
fclose(fp);
return 0;
}
The fprintf() function uses the file represented by the file pointer fp to write the data.
下一个示例显示了如何以读取模式打开同一文件来读取格式化数据。