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, . . );

这个函数的第一个参数是一个穿插着一个或多个格式说明符的字符串。第一个参数后面可以有一个或多个表达式作为参数。编译器用每个格式说明符替换它相继表达式的值。然后结果格式化字符串被传递到输出流。

Example

在下面的代码中,我们有一个 int 变量 age 和一个 float 变量 percent 。printf() 函数打印这两个值,如下所示。

#include <stdio.h>

int main(){

   int age = 18;

   float percent = 67.75;

   printf("Age: %d \nPercent: %f", age, percent);

   return 0;
}

当你运行此代码时,它将会生成以下输出:

Age: 18
Percent: 67.750000

第一个变量的值替换第一个格式说明符 %d 。类似地, %f 被变量的百分比值替换。

Format Specifiers in scanf() Function

格式说明符还用于将输入流解析成所需类型的变量。下面的例子突出了它是如何完成的。

Example

在这个例子中,程序要求用户输入年龄和百分比值。它们分别存储在 int 和 float 变量中。

#include <stdio.h>

int main(){

   int age;

   float percent;

   printf("Enter Age and Percent: \n");

   scanf("%d %f", &age, &percent);

   printf("Age: %d Percent: %f", age, percent);

   return 0;
}

运行代码并检查其输出:

Enter Age and Percent:
Age: 4096 Percent: 0.000000

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

  1. 减号 ( ) 表示左对齐。

  2. % 后的一个数字指定最小字段宽度。如果一个字符串小于宽度,它将用空格填充。

  3. 一个句点 ( . ) 用于分隔域宽和精度。

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 数组。

Example

请看以下示例:

#include <stdio.h>

int main(){

   char ch = 'D';
   char word[]="Hello World";

   printf("As character: %c\n", ch);
   printf("As its ASCII value: %d\n", ch);
   printf("String format: %s", word);

   return 0;

}

当你运行这段代码时,它将产生以下输出:

As character: D
As its ASCII value: 68
String format: Hello World

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.

下一个示例显示了如何以读取模式打开同一文件来读取格式化数据。

Example 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 读取格式化的输入,它是打开文件的指针。在此,您将获得以下输出 −

10, 20, 30