C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


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