- 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语言 - 主函数
- 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语言 - 指针与数组
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void 指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近指针、远指针和巨指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举(enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入输出
- C语言 - 文件I/O(文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 预处理指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static 关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
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