C语言中的格式说明符



C语言中的格式说明符是在格式化控制台I/O函数(如printf()和scanf())以及格式化文件I/O函数(如fprintf()和fscanf())中使用的一些特殊符号。

格式说明符由一个或多个预定义的字母数字字符序列后跟%符号组成。例如,%d、%s、%f、%lf等是一些在C语言中使用的格式说明符。

为什么在C语言中使用格式说明符?

CPU以流的方式与输入输出设备执行I/O操作。通过标准输入流从标准输入设备(例如键盘)读取的数据称为stdin。类似地,通过标准输出设备发送到标准输出(即计算机显示屏)的数据称为stdout

计算机以文本形式从流中接收数据,但是您可能希望将其解析为不同数据类型的变量,例如int、float或字符串。类似地,存储在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 \nPercent: %f", age, percent);

   return 0;
}

输出

运行代码后,将产生以下输出:

Age: 18 
Percent: 67.750000

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

scanf()函数中的格式说明符

格式说明符也用于将输入流解析为所需类型的变量。以下示例重点介绍了如何操作。

示例

在此示例中,程序要求用户输入年龄和百分比值。它们分别存储在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

格式说明符类型

ANSI C定义了许多格式说明符。下表列出了不同的说明符及其用途:

格式说明符 类型
%c 字符
%d 带符号整数
%e 或 %E 浮点数的科学计数法
%f 浮点值
%g 或 %G 与%e或%E类似
%hi 带符号整数(短整型)
%hu 无符号整数(短整型)
%i 无符号整数
%l 或 %ld 或 %li 长整型
%lf 双精度浮点数
%Lf 长双精度浮点数
%lu 无符号整型或无符号长整型
%lli 或 %lld 长长整型
%llu 无符号长长整型
%o 八进制表示
%p 指针
%s 字符串
%u 无符号整型
%x 或 %X 十六进制表示
  • 减号 () 表示左对齐。

  • %后面的数字指定最小字段宽度。如果字符串小于宽度,则将用空格填充。

  • 句点 (.) 用于分隔字段宽度和精度。

整数格式说明符

C语言使用%d表示带符号整数,%i表示无符号整数,%ld%li表示长整型,%o%O表示八进制表示,%x%X表示整数的十六进制表示。

示例

以下示例重点介绍了如何在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

浮点格式

C语言使用%f格式说明符表示单精度浮点数,%lf表示双精度浮点数,%Lf表示长双精度浮点数。要以科学计数法表示浮点数,C语言使用%e%E说明符符号。

您可以以小数点后位数的形式指定宽度和精度。例如,要将数字宽度指定为4位,小数点后2位,请使用%4.2f格式。

示例

请看下面的例子:

#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

字符串格式

C语言中的char数据类型实际上是int数据类型的子集。因此,使用%c格式说明符的char变量对应于单引号中的字符。另一方面,如果您使用%d说明符,则char变量将被格式化为其ASCII值。

在C语言中,字符串是char数据的数组。要显示char数组,C语言使用%s说明符。

示例

请看下面的例子:

#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

文件I/O函数中的格式说明符

stdio.h库定义了fscanf()fprintf()函数,用于对磁盘文件进行格式化I/O,而不是标准输入/输出流。

示例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读取格式化输入。在这里,您将得到以下输出:

10, 20, 30
广告