输入输出详解
学会输入输出,程序才能与用户交互!
输出函数 printf
基本格式化符号
| 格式符 | 数据类型 | 示例 |
|---|---|---|
%d | int | printf("%d", 123) |
%ld | long | printf("%ld", 123456L) |
%u | unsigned int | printf("%u", 123) |
%f | float/double | printf("%f", 3.14) |
%c | char | printf("%c", 'A') |
%s | 字符串 | printf("%s", "Hello") |
%p | 指针 | printf("%p", &var) |
%x | 十六进制 | printf("%x", 255) |
%o | 八进制 | printf("%o", 8) |
格式控制
#include <stdio.h>
int main() {
int num = 42;
float pi = 3.1415926;
// 控制宽度
printf("|%5d|\n", num); // | 42|(右对齐,占5位)
printf("|%-5d|\n", num); // |42 |(左对齐,占5位)
printf("|%05d|\n", num); // |00042|(前面补0)
// 控制小数位数
printf("%.2f\n", pi); // 3.14(2位小数)
printf("%.4f\n", pi); // 3.1416(4位小数)
printf("%8.2f\n", pi); // 3.14(总宽8,2位小数)
return 0;
}
输入函数 scanf
基本用法
#include <stdio.h>
int main() {
int age;
printf("请输入你的年龄:");
scanf("%d", &age); // 注意&符号!
printf("你的年龄是:%d\n", age);
return 0;
}
重要提示
scanf 中的变量前必须加 &符号(取地址符)!
scanf("%d", &age); // ✅ 正确
scanf("%d", age); // ❌ 错误!
输入多个值
#include <stdio.h>
int main() {
int age;
float height;
char grade;
printf("请输入年龄、身高、等级(用空格分隔):");
scanf("%d %f %c", &age, &height, &grade);
printf("年龄:%d\n", age);
printf("身高:%.2f\n", height);
printf("等级:%c\n", grade);
return 0;
}
输入字符串
#include <stdio.h>
int main() {
char name[50];
printf("请输入姓名:");
scanf("%s", name); // 字符串不需要&
printf("你好,%s!\n", name);
return 0;
}
scanf 的局限
scanf("%s") 遇到空格就停止:
输入:Zhang San
scanf只读取:Zhang
解决方法见后面的 fgets。
字符输入输出
getchar 和 putchar
#include <stdio.h>
int main() {
char ch;
printf("请输入一个字符:");
ch = getchar(); // 获取一个字符
printf("你输入的是:");
putchar(ch); // 输出一个字符
putchar('\n');
return 0;
}
读取整行 gets 和 fgets
#include <stdio.h>
int main() {
char name[100];
printf("请输入全名(可以有空格):");
fgets(name, sizeof(name), stdin);
printf("你好,%s", name);
return 0;
}
fgets vs scanf
scanf("%s")- 不能读空格fgets()- 可以读空格,更安全
实战案例
案例1:简单计算器
#include <stdio.h>
int main() {
float num1, num2, result;
char op;
printf("=== 简易计算器 ===\n");
printf("请输入表达式(如:5 + 3):");
scanf("%f %c %f", &num1, &op, &num2);
switch(op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 != 0) {
result = num1 / num2;
} else {
printf("错误:除数不能为0\n");
return 1;
}
break;
default:
printf("错误:不支持的运算符\n");
return 1;
}
printf("%.2f %c %.2f = %.2f\n", num1, op, num2, result);
return 0;
}
案例2:个人信息录入
#include <stdio.h>
int main() {
char name[50];
int age;
float height, weight;
char gender;
printf("=== 个人信息录入系统 ===\n\n");
printf("姓名:");
fgets(name, sizeof(name), stdin);
printf("年龄:");
scanf("%d", &age);
printf("性别(M/F):");
scanf(" %c", &gender); // 注意空格
printf("身高(米):");
scanf("%f", &height);
printf("体重(千克):");
scanf("%f", &weight);
printf("\n=== 您的信息 ===\n");
printf("姓名:%s", name);
printf("年龄:%d岁\n", age);
printf("性别:%c\n", gender);
printf("身高:%.2f米\n", height);
printf("体重:%.1f千克\n", weight);
float bmi = weight / (height * height);
printf("BMI:%.2f\n", bmi);
return 0;
}
案例3:成绩管理
#include <stdio.h>
int main() {
char name[50];
int chinese, math, english;
float average;
printf("学生姓名:");
scanf("%s", name);
printf("语文成绩:");
scanf("%d", &chinese);
printf("数学成绩:");
scanf("%d", &math);
printf("英语成绩:");
scanf("%d", &english);
average = (chinese + math + english) / 3.0;
printf("\n===== 成绩单 =====\n");
printf("姓名:%s\n", name);
printf("语文:%d\n", chinese);
printf("数学:%d\n", math);
printf("英语:%d\n", english);
printf("平均分:%.2f\n", average);
if (average >= 90) {
printf("等级:优秀\n");
} else if (average >= 80) {
printf("等级:良好\n");
} else if (average >= 60) {
printf("等级:及格\n");
} else {
printf("等级:不及格\n");
}
return 0;
}
格式化输出技巧
对齐输出
#include <stdio.h>
int main() {
printf("%-10s %-10s %-10s\n", "姓名", "年龄", "城市");
printf("%-10s %-10d %-10s\n", "张三", 20, "北京");
printf("%-10s %-10d %-10s\n", "李四", 22, "上海");
printf("%-10s %-10d %-10s\n", "王五", 21, "广州");
return 0;
}
输出:
姓名 年龄 城市
张三 20 北京
李四 22 上海
王五 21 广州
常见问题
问题1:scanf缓冲区残留
int num;
char ch;
scanf("%d", &num); // 输入:123[回车]
scanf("%c", &ch); // ch读到了换行符!
// 解决方法1:清空缓冲区
scanf("%d", &num);
getchar(); // 吃掉换行符
scanf("%c", &ch);
// 解决方法2:格式字符串加空格
scanf("%d", &num);
scanf(" %c", &ch); // 注意%c前有空格
问题2:输入验证
#include <stdio.h>
int main() {
int age;
int result;
printf("请输入年龄:");
result = scanf("%d", &age);
if (result != 1) {
printf("输入无效!\n");
return 1;
}
if (age < 0 || age > 150) {
printf("年龄不合理!\n");
return 1;
}
printf("年龄:%d\n", age);
return 0;
}
练习题
练习1:温度转换器
编写程序,输入摄氏度,输出华氏度。 公式:F = C × 9/5 + 32
练习2:圆面积计算
输入半径,计算并输出圆的面积和周长。
练习3:时间转换
输入秒数,转换为"X小时Y分钟Z秒"格式。
答案参考
查看答案
练习1:
#include <stdio.h>
int main() {
float celsius, fahrenheit;
printf("请输入摄氏度:");
scanf("%f", &celsius);
fahrenheit = celsius * 9.0 / 5.0 + 32.0;
printf("%.2f°C = %.2f°F\n", celsius, fahrenheit);
return 0;
}
练习2:
#include <stdio.h>
#define PI 3.1415926
int main() {
float radius, area, perimeter;
printf("请输入半径:");
scanf("%f", &radius);
area = PI * radius * radius;
perimeter = 2 * PI * radius;
printf("半径:%.2f\n", radius);
printf("面积:%.2f\n", area);
printf("周长:%.2f\n", perimeter);
return 0;
}
练习3:
#include <stdio.h>
int main() {
int total, hours, minutes, seconds;
printf("请输入秒数:");
scanf("%d", &total);
hours = total / 3600;
minutes = (total % 3600) / 60;
seconds = total % 60;
printf("%d秒 = %d小时%d分钟%d秒\n",
total, hours, minutes, seconds);
return 0;
}
知识点总结
- ✅ printf - 格式化输出
- ✅ scanf - 格式化输入(注意&符号)
- ✅ getchar/putchar - 字符输入输出
- ✅ fgets - 安全的字符串输入
- ✅ 格式控制:宽度、精度、对齐