1. 引言
在C语言编程中,输入输出(I/O)操作是与用户或其他程序交互的基本方式。常用的I/O函数主要定义在stdio.h
头文件中,包括printf
、scanf
、gets
、puts
等。
2. 标准输出——printf
函数
2.1 printf
函数简介
printf
函数用于将格式化的输出写到标准输出(通常是屏幕)。其基本语法如下:
int printf(const char *format, ...);
format
:格式控制字符串,指定了输出的格式。...
:可变参数,根据格式控制字符串提供要输出的值。
2.2 常用格式控制符
控制符 | 说明 |
---|---|
%d |
十进制整数 |
%f |
浮点数 |
%c |
单个字符 |
%s |
字符串 |
%u |
无符号十进制整数 |
%x |
无符号十六进制整数 |
%o |
无符号八进制整数 |
2.3 示例
#include <stdio.h>
int main() {
int age = 25;
float height = 175.5;
char grade = 'A';
char name[] = "张三";
printf("姓名: %s\n", name);
printf("年龄: %d\n", age);
printf("身高: %.1f cm\n", height);
printf("等级: %c\n", grade);
return 0;
}
输出:
姓名: 张三
年龄: 25
身高: 175.5 cm
等级: A
3. 标准输入——scanf
函数
3.1 scanf
函数简介
scanf
函数用于从标准输入(通常是键盘)读取格式化输入。其基本语法如下:
int scanf(const char *format, ...);
format
:格式控制字符串,指定了输入的格式。...
:指向接收输入值的变量的指针。
3.2 注意事项
- 取地址符
&
:在传递变量时,需使用取地址符&
,字符串除外。 - 输入缓冲区:
scanf
读取时,会受输入缓冲区影响,需注意换行符和空格的处理。
3.3 示例
#include <stdio.h>
int main() {
int age;
float height;
char name[50];
printf("请输入姓名: ");
scanf("%s", name);
printf("请输入年龄: ");
scanf("%d", &age);
printf("请输入身高(cm): ");
scanf("%f", &height);
printf("\n--- 输入的信息 ---\n");
printf("姓名: %s\n", name);
printf("年龄: %d\n", age);
printf("身高: %.1f cm\n", height);
return 0;
}
运行示例:
请输入姓名: 李四
请输入年龄: 30
请输入身高(cm): 180.2
--- 输入的信息 ---
姓名: 李四
年龄: 30
身高: 180.2 cm
4. 字符输入输出
4.1 getchar
和putchar
函数
int getchar(void);
:从标准输入读取一个字符。int putchar(int char);
:向标准输出写入一个字符。
示例:
#include <stdio.h>
int main() {
char ch;
printf("请输入一个字符: ");
ch = getchar();
printf("您输入的字符是: ");
putchar(ch);
printf("\n");
return 0;
}
4.2 gets
和puts
函数(注意:gets
已被弃用)
char *gets(char *str);
:从标准输入读取一行字符串,存入str
。int puts(const char *str);
:将字符串str
输出到标准输出,随后输出一个换行符。
**注意:**由于gets
函数不安全,可能导致缓冲区溢出,建议使用fgets
代替。
使用fgets
的示例:
#include <stdio.h>
int main() {
char str[100];
printf("请输入一行文本: ");
fgets(str, sizeof(str), stdin);
printf("您输入的文本是: ");
puts(str);
return 0;
}
5. 格式化输入输出的高级用法
5.1 控制宽度和精度
- 宽度:指定输出字段的最小宽度。
- 精度:对于浮点数,指定小数点后的位数;对于字符串,指定最大字符数。
示例:
printf("%10d\n", 123); // 输出字段宽度为10
printf("%.2f\n", 3.14159); // 保留2位小数
printf("%10.2f\n", 3.14159);// 字段宽度为10,保留2位小数
5.2 左对齐和右对齐
- 默认右对齐:在字段宽度内,内容靠右排列。
- 左对齐:在格式控制符中加入
-
。
示例:
printf("%-10d\n", 123); // 左对齐,字段宽度为10
6. 常见问题和注意事项
6.1 缓冲区问题
scanf
遗留的换行符:使用scanf
读取字符时,可能会读取到上一次输入遗留的换行符,需要清除输入缓冲区。- 解决方法:在读取字符前,使用
getchar()
清除缓冲区,或者使用scanf(" %c", &ch);
,在%c
前加空格。
6.2 安全性
- 避免使用
gets
函数:gets
函数不安全,容易导致缓冲区溢出。 - 使用
fgets
替代:fgets
可以指定读取的最大字符数,更安全。
6.3 格式控制符匹配
- 类型匹配:确保格式控制符与变量类型匹配,否则会导致不可预知的错误。
7. 总结
printf
和scanf
是最常用的标准输出和输入函数,需要熟练掌握其用法和格式控制符。- 注意输入输出的安全性,尽量使用安全的函数,如
fgets
。 - 熟悉格式化字符串的高级用法,可以使输出更美观,更符合要求。