C 语言中的格式说明符
C 语言中的格式说明符是一些特殊符号,用于格式化控制台 IO 函数(例如 printf() 和 scanf())以及格式化文件 IO 函数(例如 fprintf() 和 fscanf())。
格式说明符由一个或多个字母数字字符加上 % 符号的预定义序列组成。例如,%d、%s、%f、%lf 等是 C 语言中使用的一些格式说明符。
为什么在 C 语言中使用格式说明符?
CPU 以流式方式与输入输出设备执行 IO 操作。通过标准输入流从标准输入设备(例如键盘)读取的数据称为 stdin。类似地,通过标准输出设备发送到标准输出(即计算机显示屏)的数据称为stdout。
计算机以文本形式从流中接收数据,但您可能希望将其解析为不同类型的变量,例如int、float或string。同样,存储在int、float或char变量中的数据必须以文本格式发送到输出流。格式说明符正是用于此目的。
printf() 函数中的格式说明符
printf() 函数是最常用的标准输出函数,定义在stdio.h头文件中。printf() 函数的原型如下:
int printf(format_string, expr1, expr2, . . );
此函数的第一个参数是一个字符串,其中穿插着一个或多个格式说明符。第一个参数之后可以有一个或多个表达式作为参数。编译器会将每个格式说明符替换为其后续表达式的值。然后将格式化后的字符串传递到输出流。
示例
在下面的代码中,我们有一个 int 变量 age 和一个 float 变量 percent。printf() 函数将打印这两个变量的值,如下所示 -
#include <stdio.h> int main(){ int age = 18; float percent = 67.75; printf("Age: %d Percent: %f", age, percent); return 0; }
输出
运行代码时,将产生以下输出 -
Age: 18 Percent: 67.750000
第一个变量的值替换第一个格式说明符 %d。类似地,%f 被百分比变量的值替换。
scanf() 函数中的格式说明符
格式说明符也用于将输入流解析为所需类型的变量。以下示例重点介绍了如何执行此操作。
示例
在此示例中,程序要求用户输入年龄和百分比值。它们分别存储在 int 和 float 变量中。
#include <stdio.h> int main(){ int age; float percent; printf("Enter Age and Percent: "); scanf("%d %f", &age, &percent); printf("Age: %d Percent: %f", age, percent); return 0; }
输出
运行代码并检查其输出 −
Enter Age and Percent: Age: 4096 Percent: 0.000000
格式说明符的类型
ANSI C 定义了许多格式说明符。下表列出了不同的说明符及其用途 -
格式说明符 | 类型 |
---|---|
%c | 字符 |
%d | 有符号整数 |
%e 或 %E | 浮点数的科学计数法 |
%f | 浮点值 |
%g 或 %G | 类似于 %e 或%E |
%hi | 有符号整数(短整型) |
%hu | 无符号整数(短整型) |
%i | 无符号整数 |
%l 或 %ld 或 %li | 长整型 |
%lf | 双精度型 |
%Lf | 长双精度型 |
%lu | 无符号整数或无符号long |
%lli 或 %lld | Long long |
%llu | 无符号 long long |
%o | 八进制表示 |
%p | 指针 |
%s | 字符串 |
%u | 无符号 int |
%x 或 %X | 十六进制表示 |
减号 (−) 表示左对齐。
% 后的数字指定最小字段宽度。如果字符串小于宽度,则会用空格填充。
句点 (.) 用于分隔字段宽度和精度。
整数格式说明符
C 使用 %d 表示有符号整数,%i 表示无符号整数,%ld 或 %li 表示长整数,%o 或 %O 表示八进制表示,%x 或 %X 表示十六进制表示。
示例
以下示例重点介绍了如何在 C 语言中使用整数格式说明符 -
#include <stdio.h> int main(){ int num = 20; printf("Signed integer: %d ", num); printf("Unsigned integer: %i ", num); printf("Long integer: %ld ", num); printf("Octal integer: %o ", num); printf("Hexadecimal integer: %x ", num); return 0; }
输出
运行此代码时,将产生以下输出 -
Signed integer: 20 Unsigned integer: 20 Long integer: 20 Octal integer: 24 Hexadecimal integer: 14
浮点格式
C 语言使用 %f 格式说明符表示单精度浮点数,%lf 表示双精度浮点数,%Lf 表示长双精度浮点数。要以科学计数法表示浮点数,C 语言使用 %e 或 %E 说明符。
您可以用小数点后位数的形式指定宽度和精度。例如,要将数字宽度表示为 4 位,小数点后保留 2 位,请使用 %4.2f 格式。
示例
请看以下示例 -
#include <stdio.h> int main(){ float num = 5.347; printf("float: %f ", num); printf("double: %lf ", num); printf("Scientific notation: %e ", num); printf("width and precision: %4.2f ", num); return 0; }
输出
运行此代码后,您将获得以下输出 -
float: 5.347000 double: 5.347000 Scientific notation: 5.347000e+000 width and precision: 5.35
字符串格式
C 语言中的 char 数据类型实际上是 int 数据类型的子集。因此,带有 %c 格式说明符的 char 变量对应于单引号中的字符。另一方面,如果使用 %d 说明符,则 char 变量将被格式化为其 ASCII 值。
在 C 语言中,字符串是 char 数据的数组。要显示字符数组,C 语言使用 %s 说明符。
示例
请看以下示例 -
#include <stdio.h> int main(){ char ch = 'D'; char word[]="Hello World"; printf("As character: %c ", ch); printf("As its ASCII value: %d ", ch); printf("String format: %s", word); return 0; }
输出
运行此代码时,将产生以下输出 -
As character: D As its ASCII value: 68 String format: Hello World
文件 IO 函数中的格式说明符
stdio.h 库定义了函数 fscanf() 和 fprintf(),用于对磁盘文件进行格式化 IO,而不是标准输入/输出流。
示例 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.
下一个示例展示如何以读取模式打开同一个文件并读取格式化的数据。
示例 2
以下程序通过以读取模式打开文件来读取其中的数据。
#include <stdio.h> int main(){ int x,y,z; FILE *fp = fopen("test.txt","r"); fscanf(fp, "%d, %d, %d", &x,&y,&z); printf("%d, %d, %d", x,y,z); fclose(fp); return 0; }
输出
fscanf() 函数从 fp 读取格式化的输入,fp 是指向已打开文件的指针。在这里,您将获得以下输出 -
10, 20, 30