printf()
函数定义在头文件 <stdio.h>
中,用于将格式化的数据输出到控制台(终端)。
一、基本格式
#include <stdio.h>
int main() {
printf("格式控制字符串", 输出列表);
return 0;
}
- 格式控制字符串:包含普通字符和格式说明符。
- 输出列表:与格式说明符一一对应的变量或表达式。
二、常用格式说明符(Format Specifiers)
格式符 | 类型 | 示例 |
---|---|---|
%d | 十进制有符号整数 | int |
%u | 十进制无符号整数 | unsigned int |
%ld | 长整型(long) | long |
%lld | 长长整型(long long) | long long |
%f | 浮点数(float/double) | float , double |
%c | 字符 | char |
%s | 字符串 | "Hello" |
%x | 十六进制小写输出 | unsigned int |
%X | 十六进制大写输出 | unsigned int |
%o | 八进制输出 | unsigned int |
%p | 指针地址 | &variable |
%% | 输出一个 % 符号 |
三、格式化输出示例
1. 基本数据类型输出
#include <stdio.h>
int main() {
int a = 10;
float b = 3.14159;
char c = 'A';
char str[] = "Hello, World!";
printf("整数: %d\n", a);
printf("浮点数: %f\n", b);
printf("字符: %c\n", c);
printf("字符串: %s\n", str);
return 0;
}
输出:
整数: 10
浮点数: 3.141590
字符: A
字符串: Hello, World!
2. 控制小数位数(浮点数)
printf("保留2位小数: %.2f\n", b); // 输出 3.14
3. 控制宽度(对齐)
printf("占10位宽度: %10d\n", a); // 输出 " 10"
printf("占10位宽度左对齐: %-10d\n", a); // 输出 "10 "
4. 输出十六进制、八进制
int num = 255;
printf("十六进制小写: %x\n", num); // 输出 ff
printf("十六进制大写: %X\n", num); // 输出 FF
printf("八进制: %o\n", num); // 输出 377
5. 输出地址
int x = 10;
printf("变量x的地址: %p\n", &x); // 输出类似 0x7fff5fbff5ac
四、格式化字符串修饰符(可选)
你可以通过在格式符前添加修饰符来更精确地控制输出格式:
修饰符 | 含义 |
---|---|
l | 用于 long 或 double |
ll | 用于 long long |
h | 用于 short |
z | 用于 size_t |
. | 控制小数位数 |
数字 | 控制最小输出宽度 |
- | 左对齐 |
0 | 用0填充空格 |
示例:
long long big = 1234567890123LL;
printf("长整型: %lld\n", big);
double d = 123.456789;
printf("宽度10,保留2位小数: %10.2f\n", d); // 输出 " 123.46"
五、注意事项
- 格式符与变量类型必须匹配,否则可能导致未定义行为。
- 使用
scanf()
输入时,格式符与变量类型也必须匹配,并且要加&
(除数组)。 printf()
不会自动换行,需手动添加\n
。- 对于字符串输出,
%s
会自动输出到\0
为止。
六、完整示例程序
#include <stdio.h>
int main() {
int age = 25;
float height = 175.5;
char initial = 'J';
char name[] = "John";
printf("姓名: %s\n", name);
printf("首字母: %c\n", initial);
printf("年龄: %d 岁\n", age);
printf("身高: %.1f cm\n", height);
printf("十六进制年龄: %x\n", age);
printf("地址: %p\n", &age);
return 0;
}
姓名: John
首字母: J
年龄: 25 岁
身高: 175.5 cm
十六进制年龄: 19
地址: 0x7ffee4b59a7c
七、总结
功能 | 函数/格式符 |
---|---|
格式化输出 | printf() |
整数输出 | %d |
浮点数输出 | %f , %.2f |
字符输出 | %c |
字符串输出 | %s |
地址输出 | %p |
十六进制输出 | %x / %X |
八进制输出 | %o |
控制宽度/精度 | %10.2f |
左对齐 | %-10d |
八、scanf()
函数用于从标准输入(通常是键盘)读取格式化输入,并根据指定的格式符将输入值存储到对应的变量中。它是 <stdio.h>
头文件中的标准函数,常用于用户交互。
读取整数、浮点数、字符、字符串
#include <stdio.h>
int main() {
int age;
float height;
char initial;
char name[50];
printf("请输入你的姓名: ");
scanf("%s", name); // 读取字符串(不带空格)
printf("请输入你的年龄: ");
scanf("%d", &age);
printf("请输入你的身高: ");
scanf("%f", &height);
printf("请输入你的首字母: ");
scanf(" %c", &initial); // 注意前面的空格,防止缓冲区残留
printf("姓名: %s\n", name);
printf("年龄: %d\n", age);
printf("身高: %.2f\n", height);
printf("首字母: %c\n", initial);
return 0;
}
注意事项
1. 必须使用 &
运算符
scanf()
需要变量的地址来存储输入值。数组名
不需要加&
,因为数组名本身表示地址。
int a;
scanf("%d", &a); // 正确
2. 字符串输入只读取到空格为止
%s
只读取第一个单词,遇到空格、换行、Tab 会停止。
char name[100];
scanf("%s", name); // 输入 "John Doe",只会读取 "John"
如需读取整行,可以使用 fgets()
。
3. 跳过空白字符
scanf()
默认会跳过前导空白字符(空格、换行、Tab)。- 例外是
%c
,它会读取包括空格在内的字符。
char c;
scanf("%c", &c); // 会读取换行符或空格
建议在 %c
前加空格来跳过前面的空白:
scanf(" %c", &c); // 跳过前面的空白
4. 避免缓冲区残留
- 多次
scanf()
可能会因为缓冲区残留导致错误。 - 可以在输入后使用
getchar()
清除换行符:
scanf("%d", &age);
getchar(); // 清除换行符
或者使用更安全的方式:
while (getchar() != '\n'); // 清空缓冲区