知识点精讲
一、输入输出基础概念
C语言本身无输入输出语句,依赖标准库函数实现,核心头文件:#include <stdio.h>(standard input output)。
核心分类:
字符输入输出:getchar()、putchar()
格式输入输出:scanf()、printf()(高频考点)
// 输入输出函数基本结构示例
#include
int main() {
// 头文件必须包含,否则函数无法识别
int num;
printf("请输入一个整数:"); // 格式输出
scanf("%d", &num); // 格式输入(注意&取地址符)
printf("你输入的数是:%d\n", num);
return 0;
}
二、字符输入输出函数
1. putchar() - 字符输出
功能:向控制台输出单个字符,参数为字符/ASCII码值。
#include
int main() {
putchar('A'); // 输出字符A
putchar(65); // 输出ASCII码65对应的字符A
putchar('\n'); // 输出换行符
return 0;
}
2. getchar() - 字符输入
功能:从控制台读取单个字符,无参数,返回读取的字符(ASCII码)。
#include
int main() {
char ch;
printf("请输入一个字符:");
ch = getchar(); // 读取字符
printf("你输入的字符是:");
putchar(ch); // 输出字符
return 0;
}
注意 :getchar会读取缓冲区的任意字符(包括回车\n),易导致后续输入异常(高频考点)。
三、格式输出函数printf()(高频考点)
核心语法:printf("格式控制字符串", 输出列表);
格式控制字符串组成:普通字符(直接输出)+ 格式说明符(%+格式符)。
1. 常用格式符(必考)
格式符
对应类型
示例
输出结果
%d
整型(int)
printf("%d", 100);
100
%c
字符型(char)
printf("%c", 'a');
a
%f
浮点型(float/double)
printf("%f", 3.14);
3.140000
%s
字符串
printf("%s", "hello");
hello
%lf
双精度浮点型(double)
printf("%lf", 3.14);
3.140000
%u
无符号整型
printf("%u", -1);
4294967295
2. 格式修饰符(高频考点)
#include
int main() {
// 宽度修饰:%5d 表示占5个字符宽度,右对齐
printf("宽度修饰:%5d\n", 123); // 输出" 123"(前面2个空格)
// 精度修饰:%.2f 表示保留2位小数
printf("精度修饰:%.2f\n", 3.1415); // 输出"3.14"
// 宽度+精度:%8.2f 占8位宽度,保留2位小数
printf("混合修饰:%8.2f\n", 3.1415); // 输出" 3.14"(前面4个空格)
return 0;
}
3. 转义字符(必考)
#include
int main() {
printf("换行\\n:第一行\n第二行"); // 换行
printf("\\t制表符:a\tb"); // 制表符(相当于Tab)
printf("\\b退格符:abc\bd"); // 退格,输出"abd"
return 0;
}
四、格式输入函数scanf()(高频考点)
核心语法:scanf("格式控制字符串", 变量地址列表);
核心规则 :变量前必须加&(取地址符),数组名除外(数组名本身是地址)。
1. 基本使用
#include
int main() {
int a;
float b;
char c;
// 单变量输入
scanf("%d", &a); // 输入整型
scanf("%f", &b); // 输入浮点型
scanf(" %c", &c); // 空格规避缓冲区残留问题
// 多变量输入(空格/回车/制表符分隔)
scanf("%d%f%c", &a, &b, &c);
return 0;
}
2. 输入分隔规则
多个变量输入时,可用空格、回车、Tab作为分隔符
若格式串中有普通字符(如逗号),输入时必须输入对应字符
#include
int main() {
int x, y;
// 格式串含逗号,输入需写:10,20
scanf("%d,%d", &x, &y);
printf("x=%d, y=%d\n", x, y);
return 0;
}
3. 缓冲区问题(高频易错点)
scanf读取字符时,会读取上一次输入的回车符(\n),导致读取异常:
// 错误示例
#include
int main() {
int num;
char ch;
scanf("%d", &num); // 输入10并回车
scanf("%c", &ch); // 读取到的是回车符\n,而非预期字符
printf("ch=%c", ch); // 输出空行
return 0;
}
// 正确解法:在%c前加空格
#include
int main() {
int num;
char ch;
scanf("%d", &num);
scanf(" %c", &ch); // 空格跳过缓冲区的回车符
printf("ch=%c", ch);
return 0;
}
五、输入输出常见错误(高频考点)
头文件缺失 :未包含#include <stdio.h>,编译报错
scanf漏写& :scanf("%d", num); 运行崩溃(必须&num)
格式符不匹配 :scanf("%d", &f);(f是float型,应用%f)
printf用%lf输出double :C语言中printf的%f可兼容float/double,%lf也可,但scanf中%lf才对应double
字符输入缓冲区残留 :未处理回车符导致读取错误
精度修饰错误 :printf("%d.2f", 3.14);(整型格式符加精度修饰)
// 错误示例1:scanf漏写&
#include
int main() {
int a;
scanf("%d", a); // 错误:应为&a
printf("%d", a);
return 0;
}
// 错误示例2:格式符不匹配
#include
int main() {
float score = 95.5;
printf("%d", score); // 错误:float应用%f,输出随机数
return 0;
}
例题精选
例题1:字符输入输出基础
使用getchar()读取一个字符,通过putchar()输出该字符及其ASCII码值。
#include
int main() {
char ch;
printf("请输入一个字符:");
ch = getchar(); // 读取字符
printf("你输入的字符是:");
putchar(ch); // 输出字符
printf("\n该字符的ASCII码:%d\n", ch); // 输出ASCII码
return 0;
}
显示结果与解析
运行结果(输入示例:a):
请输入一个字符:a
你输入的字符是:a
该字符的ASCII码:97
解析:
1. getchar()返回字符的ASCII码值,赋值给char型变量ch后仍可正常存储;
2. putchar(ch)输出字符,printf("%d", ch)输出对应的ASCII码;
3. 若输入数字字符(如'5'),ASCII码输出53(而非数字5),是高频易错点。
例题2:printf格式符与修饰符
使用printf输出整型、浮点型数据,配置宽度和精度修饰符。
#include
int main() {
int num = 123;
float pi = 3.1415926;
// 宽度修饰(5位)、精度修饰(3位小数)、混合修饰
printf("整型宽度修饰:%5d\n", num);
printf("浮点精度修饰:%.3f\n", pi);
printf("混合修饰(8位宽度+2位小数):%8.2f\n", pi);
return 0;
}
显示结果与解析
运行结果:
整型宽度修饰: 123
浮点精度修饰:3.142
混合修饰(8位宽度+2位小数): 3.14
解析:
1. %5d表示占5个字符宽度,右对齐,不足补空格;
2. %.3f表示保留3位小数,自动四舍五入(3.1415926→3.142);
3. %8.2f表示总宽度8位(含小数点),保留2位小数,不足补空格。
例题3:scanf多变量输入(含分隔符)
输入两个整数,格式为“数字1,数字2”,输出两数之和。
#include
int main() {
int a, b, sum;
printf("请输入两个整数(格式:a,b):");
scanf("%d,%d", &a, &b); // 格式串含逗号,输入必须匹配
sum = a + b;
printf("两数之和:%d\n", sum);
return 0;
}
显示结果与解析
运行结果(输入示例:10,20):
请输入两个整数(格式:a,b):10,20
两数之和:30
解析:
1. scanf格式串中的逗号是普通字符,输入时必须输入逗号分隔,否则读取失败;
2. 若输入10 20(空格分隔),scanf会读取a=10,b为随机数(匹配失败);
3. 多变量输入的分隔符需与格式串严格一致,是考试核心考点。
例题4:scanf字符输入缓冲区问题解决
先输入整数,再输入字符,解决回车符残留导致的字符读取异常问题。
#include
int main() {
int num;
char ch;
printf("请输入一个整数:");
scanf("%d", &num);
// 解决方案1:在%c前加空格
scanf(" %c", &ch);
// 解决方案2:用getchar()吸收回车符
// getchar();
// scanf("%c", &ch);
printf("整数:%d,字符:%c\n", num, ch);
return 0;
}
显示结果与解析
运行结果(输入示例:10↵a):
请输入一个整数:10
a
整数:10,字符:a
解析:
1. 输入10并回车后,缓冲区残留\n,若直接scanf("%c", &ch)会读取\n;
2. 解决方案1:%c前加空格,scanf会自动跳过所有空白字符(空格/回车/Tab);
3. 解决方案2:用getchar()吸收缓冲区的\n,再读取目标字符;
4. 该问题是输入输出模块最高频的考点,必须掌握两种解决方案。
例题5:混合类型数据输入输出
输入整型、浮点型、字符型数据,按指定格式输出。
#include
int main() {
int age;
float score;
char gender;
printf("请输入年龄(整型)、成绩(浮点型)、性别(字符):");
scanf("%d%f %c", &age, &score, &gender); // 浮点与字符间加空格规避问题
printf("个人信息:\n");
printf("年龄:%d岁\n", age);
printf("成绩:%.1f分\n", score); // 保留1位小数
printf("性别:%c\n", gender);
return 0;
}
显示结果与解析
运行结果(输入示例:18 95.5 M):
请输入年龄(整型)、成绩(浮点型)、性别(字符):18 95.5 M
个人信息:
年龄:18岁
成绩:95.5分
性别:M
解析:
1. 混合类型输入时,浮点型与字符型之间需加空格分隔(或在%c前加空格);
2. 输出浮点型时用%.1f控制精度,符合实际场景的显示需求;
3. 若输入时未加空格(如1895.5M),会导致age=1895,score=0.5,gender=M,读取异常。
例题6:输入输出常见错误排查
修正以下代码的输入输出错误,使其能正确运行并输出结果。
// 错误代码
#include
int main() {
double height;
char name[10];
printf("请输入姓名和身高(米):");
scanf("%s%lf", name, height); // 错误1:height漏&?不,数组名无需&,但double应用%lf
printf("姓名:%s,身高:%f厘米\n", name, height*100);
return 0;
}
// 修正后代码
#include
int main() {
double height;
char name[10];
printf("请输入姓名和身高(米):");
scanf("%s%lf", name, &height); // 修正:height加&
printf("姓名:%s,身高:%.1f厘米\n", name, height*100); // 加精度修饰更规范
return 0;
}
显示结果与解析
运行结果(输入示例:张三 1.75):
请输入姓名和身高(米):张三 1.75
姓名:张三,身高:175.0厘米
解析:
1. 核心错误:scanf中height是double型变量,必须加&(数组名无需&,变量必须加);
2. 次要优化:printf输出时加精度修饰(%.1f),避免输出过多小数位;
3. 易错点区分:数组名(如name)本身是地址,scanf中无需加&;普通变量(如height)必须加&。