格式控制符
格式控制符是C语言输入输出函数中的关键组成部分,用于指定数据的输入输出格式。它们与变量的存储类型密切相关,确保数据在内存与外部设备间正确转换。
常见格式控制符汇总
| %d | 有符号十进制整型 | +, -, 0-9 | -123 |
| %u | 无符号十进制整型 | 0-9 | 456 |
| %o | 八进制整型 | 0-7 | 0173 |
| %x / %X | 十六进制整型 | 0-9, a-f/A-F (可识别0x前缀) | 0x7b / 0X7B |
| %f | 单精度浮点型 | +, -, 0-9, ., e/E | 3.141593 |
| %lf | 双精度浮点型 | 同上 | 3.1415926536 |
| %e / %E | 指数形式浮点数 | 同上 | 3.141593e+00 |
| %g / %G | 自动选择%f或%e | 同上 | 3.14159 |
| %c | 字符型 | 任意单个字符 | A |
| %s | 字符串 | 非空白字符序列 | Hello |
| %p | 指针地址 | – | 0x7ffeeb5d8c |
| %% | 百分号本身 | – | % |
格式控制符工作原理
格式控制符在输入输出过程中起到数据类型转换的作用:
- 输入时:将外部字符序列按照指定格式解析,转换为内部二进制表示
- 输出时:将内部二进制数据按照指定格式转换为字符序列
例如:
int num;
scanf("%d", &num); // 输入"123",转换为整数123存储在内存中
printf("%d", num); // 将内存中的整数123转换为字符"123"输出
输入时格式控制符的特殊行为
- %d、%u:自动跳过前导空白字符,读取连续的数字字符
- %c:读取下一个字符(包括空格、换行等空白字符)
- %s:读取连续的非空白字符序列,自动添加\\0
- %f、%lf:可识别小数点和科学计数法表示
输出函数
printf函数
基本格式
#include <stdio.h>
int printf(const char *format, ...);
- format:格式控制字符串,包含普通字符和格式控制符
- …:可变参数列表,与格式控制符一一对应
- 返回值:成功输出的字符数
格式控制符完整语法
%[标志][宽度][.精度][长度]类型
标志字符
| – | 左对齐 | %-10d |
| + | 显示正负号 | %+d |
| 空格 | 正数前加空格 | % d |
| 0 | 用0填充空白 | %08d |
| # | 显示进制前缀 | %#x → 0x7b |
宽度与精度
int num = 123;
float f = 3.14159;
printf("%10d\\n", num); // 宽度10,右对齐:" 123"
printf("%-10d\\n", num); // 宽度10,左对齐:"123 "
printf("%010d\\n", num); // 宽度10,用0填充:"0000000123"
printf("%.2f\\n", f); // 保留2位小数:"3.14"
printf("%8.2f\\n", f); // 宽度8,保留2位小数:" 3.14"
长度修饰符
| h | short | %hd |
| l | long | %ld, %lf |
| ll | long long | %lld |
| L | long double | %Lf |
完整示例
#include <stdio.h>
int main() {
int a = 123;
float b = 3.14159;
char c = 'A';
char str[] = "Hello";
printf("十进制: %d\\n", a);
printf("八进制: %o (带前缀: %#o)\\n", a, a);
printf("十六进制: %x (大写: %X, 带前缀: %#x)\\n", a, a, a);
printf("浮点数: %f (保留2位: %.2f)\\n", b, b);
printf("指数形式: %e\\n", b);
printf("自动选择: %g\\n", b);
printf("字符: %c, ASCII: %d\\n", c, c);
printf("字符串: %s\\n", str);
printf("地址: %p\\n", &a);
printf("百分号: %%\\n");
return 0;
}
putchar函数
输出单个字符的简单函数:
#include <stdio.h>
int putchar(int c); // 返回输出的字符,失败返回EOF
示例:
putchar('A'); // 输出字符A
putchar('\\n'); // 输出换行
putchar(65); // 输出ASCII码65对应的字符'A'
puts函数
输出字符串并自动添加换行:
#include <stdio.h>
int puts(const char *s); // 返回非负值表示成功,EOF表示失败
示例:
puts("Hello World!"); // 输出"Hello World!"并换行
注意:puts比printf效率高,但功能有限。
sprintf函数
将格式化字符串写入字符数组:
#include <stdio.h>
int sprintf(char *str, const char *format, ...);
示例:
#include <stdio.h>
int main() {
char buffer[100];
int num = 123;
float fnum = 3.14159;
// 将格式化字符串写入buffer
int len = sprintf(buffer, "整数: %d, 浮点数: %.2f", num, fnum);
printf("写入内容: %s\\n", buffer);
printf("写入长度: %d\\n", len); // 不包括\\0
return 0;
}
安全警告:sprintf不会检查目标数组大小,可能导致缓冲区溢出。建议使用更安全的snprintf:
char buffer[20];
// 最多写入19个字符+1个\\0
snprintf(buffer, sizeof(buffer), "数字: %d", 1234567890);
输入函数
scanf函数
基本格式
#include <stdio.h>
int scanf(const char *format, ...);
- format:格式控制字符串
- …:变量地址列表(必须使用&取地址)
- 返回值:成功读取并赋值的变量个数
输入格式控制
int a, b;
float f;
char c;
char str[20];
// 基本输入
scanf("%d", &a); // 输入整数
scanf("%f", &f); // 输入浮点数
scanf(" %c", &c); // 注意空格,跳过空白字符
scanf("%s", str); // 输入字符串(无空格)
// 多个输入
scanf("%d %f", &a, &f); // 用空格分隔
scanf("%d,%f", &a, &f); // 用逗号分隔(输入时也要用逗号)
scanf("%2d", &a); // 最多读取2位数字
// 抑制赋值
scanf("%*d %d", &a); // 跳过第一个整数,读取第二个
输入缓冲区机制 scanf不是直接从键盘读取,而是从输入缓冲区读取:
#include <stdio.h>
int main() {
int num;
char ch;
printf("请输入一个数字: ");
scanf("%d", &num); // 输入"123\\n",读取123,\\n留在缓冲区
printf("请输入一个字符: ");
scanf(" %c", &ch); // 空格跳过空白字符(包括\\n)
printf("num=%d, ch=%c\\n", num, ch);
return 0;
}
getchar函数
从标准输入读取单个字符:
#include <stdio.h>
int getchar(void); // 返回读取的字符,失败返回EOF
示例:
#include <stdio.h>
int main() {
printf("请输入一个字符: ");
int ch = getchar(); // 使用int接收,以便判断EOF
if (ch != EOF) {
printf("你输入的是: %c (ASCII: %d)\\n", ch, ch);
}
// 清空输入缓冲区
while ((ch = getchar()) != '\\n' && ch != EOF);
return 0;
}
网硕互联帮助中心






评论前必须登录!
注册