C语言输入输出函数详解:与程序交互的桥梁
一、概述
程序与用户的交互离不开输入输出功能。C语言通过标准库函数实现输入输出,这些函数都声明在stdio.h头文件中。本章将详细介绍最常用的输入输出函数。
二、printf函数——格式化输出
2.1 printf的基本用法
printf函数用于将数据格式化输出到屏幕(标准输出设备)。其基本格式为:
printf("格式控制字符串", 输出参数列表);
示例:
#include <stdio.h>
int main()
{
int a = 10;
float b = 3.14;
printf("a = %d, b = %f\\n", a, b);
return 0;
}
其中,"%d"和"%f"是格式控制符,用于指定输出的格式。
2.2 整数输出格式控制符
使用printf输出整数时,需要考虑两个因素:整数的类型和输出的进制。
| %d | 以带符号十进制形式输出整数 |
| %u | 以无符号十进制形式输出整数 |
| %o | 以无符号八进制形式输出整数 |
| %x | 以无符号十六进制形式输出整数(小写) |
| %X | 以无符号十六进制形式输出整数(大写) |
注意:这些格式控制符默认用于int类型,可以通过前缀修饰:
| %hd | short类型 |
| %ld | long类型 |
| %lld | long long类型 |
int a = 255;
printf("%d\\n", a); // 输出:255
printf("%o\\n", a); // 输出:377
printf("%x\\n", a); // 输出:ff
printf("%X\\n", a); // 输出:FF
printf("%u\\n", a); // 输出:255
2.3 浮点数输出格式控制符
| %f | 以十形式输出浮点数进制小数 |
| %e | 以科学计数法形式输出(小写e) |
| %E | 以科学计数法形式输出(大写E) |
| %g | 自动选择%f或%e中较短的形式 |
| %G | 自动选择%f或%E中较短的形式 |
double x = 123.456;
printf("%f\\n", x); // 输出:123.456000
printf("%e\\n", x); // 输出:1.234560e+02
printf("%g\\n", x); // 输出:123.456
精度控制:可以在格式控制符中指定精度
double pi = 3.1415926;
printf("%.2f\\n", pi); // 输出:3.14(保留两位小数)
printf("%.4f\\n", pi); // 输出:3.1416(保留四位小数)
2.4 字符和字符串输出
| %c | 输出一个字符 |
| %s | 输出字符串 |
char c = 'A';
char s[] = "Hello";
printf("%c\\n", c); // 输出:A
printf("%s\\n", s); // 输出:Hello
2.5 其他格式控制符
| %p | 以十六进制形式输出指针地址 |
| %% | 输出百分号字符 |
| %zu | 输出size_t类型的值 |
int a = 10;
int *p = &a;
printf("%p\\n", p); // 输出指针地址,如:0061FF2C
printf("100%%\\n"); // 输出:100%
printf("%zu\\n", sizeof(int)); // 输出:4
2.6 宽度控制
可以通过指定宽度来控制输出格式:
int a = 123;
printf("%5d\\n", a); // 输出: 123(右对齐,总宽度5)
printf("%-5d\\n", a); // 输出:123 (左对齐,总宽度5)
printf("%05d\\n", a); // 输出:00123(不足部分用0填充)
三、scanf函数——格式化输入
3.1 scanf的基本用法
scanf函数用于从键盘(标准输入设备)读取数据到变量中。其基本格式为:
scanf("格式控制字符串", 输入参数地址列表);
重要:输入参数必须是变量的地址!
int a;
scanf("%d", &a); // 正确:传入变量a的地址
// 错误示范
// scanf("%d", a); // 错误:a是值,不是地址
3.2 scanf格式控制符
| %d | 读入十进制整数 |
| %f | 读入单精度浮点数(float) |
| %lf | 读入双精度浮点数(double) |
| %c | 读入一个字符 |
| %s | 读入一个字符串 |
int a;
float b;
char c;
scanf("%d", &a); // 输入一个整数
scanf("%f", &b); // 输入一个单精度浮点数
scanf("%lf", &b); // 输入一个双精度浮点数
scanf("%c", &c); // 输入一个字符
// 同时输入多个值
scanf("%d %f %c", &a, &b, &c);
3.3 scanf使用注意事项
跳过空白符
使用%d读取整数时,scanf会跳过输入缓冲区中的空白符(空格、跳格、换行),直到读到有效数字。
间隔符问题
如果scanf包含多个格式控制符,输入时这些值必须用空白符分隔:
int a, b;
scanf("%d%d", &a, &b); // 输入:10 20 或 10\\n20 都可以
字符串输入的问题
使用%s读取字符串时,遇到空白符会停止:
char name[20];
scanf("%s", name); // 如果输入"Li Lei",只会读到"Li"
这是因为%s遇到空格就认为字符串结束了。
3.4 输入缓冲区
需要理解scanf的工作原理:用户的输入会先存入输入缓冲区,只有按下回车键后,数据才会被送到内存中供scanf读取。
int a;
scanf("%d", &a); // 如果缓冲区没有数据,程序会等待用户输入
四、字符输入输出函数
4.1 putchar函数——输出单个字符
putchar函数用于向屏幕输出一个字符:
#include <stdio.h>
int main()
{
putchar('A'); // 输出:A
putchar('\\n'); // 换行
return 0;
}
4.2 getchar函数——输入单个字符
getchar函数用于从输入缓冲区读取一个字符:
#include <stdio.h>
int main()
{
char c;
c = getchar(); // 读取一个字符
putchar(c); // 输出该字符
return 0;
}
注意:getchar返回的是int类型,而不是char类型。这是因为它还可能返回EOF(文件结束标志)。
int c; // 建议用int类型接收getchar的返回值
while ((c = getchar()) != EOF) {
putchar(c);
}
五、字符串输入输出函数
5.1 puts函数——输出字符串
puts函数用于输出整个字符串:
#include <stdio.h>
int main()
{
char s[] = "Hello, World!";
puts(s); // 输出:Hello, World!
return 0;
}
特点:
- 输出字符串后会自动换行
- 只能输出字符串,不能混合输出其他类型数据
5.2 gets函数——输入字符串(已淘汰)
gets函数曾用于读取一行字符串,但由于它不会检查数组边界,容易造成缓冲区溢出,已被C11标准淘汰。
5.3 fgets函数——安全的字符串输入
推荐使用fgets代替gets:
char s[20];
fgets(s, sizeof(s), stdin); // 从键盘读取最多sizeof(s)-1个字符
参数说明:
- 第一个参数:字符数组名
- 第二个参数:数组长度
- 第三个参数:文件指针,stdin表示标准输入(键盘)
#include <stdio.h>
int main()
{
char name[20];
printf("请输入您的名字:");
fgets(name, sizeof(name), stdin);
printf("您好,%s", name);
return 0;
}
注意:fgets会保留输入时的换行符,如果不想保留,可以使用strcspn去除:
name[strcspn(name, "\\n")] = '\\0'; // 去除换行符
六、本章小结
本章我们详细介绍了C语言的输入输出函数:
这些函数是与程序进行交互的基础,在后续的编程中会频繁使用。熟练掌握这些函数的使用方法,对C语言编程至关重要。
下一章预告:我们将学习C语言的程序控制结构,包括条件语句和循环语句。



