输入输出处理
对应教学日历:讲次 3(3月19日)
一、printf 格式化输出
printf("格式控制字符串", 参数1, 参数2, ...);常用格式符
| 格式符 | 含义 | 示例 |
|---|---|---|
%d | 十进制有符号整数 | printf("%d", 100) → 100 |
%o | 八进制无符号整数 | printf("%o", 10) → 12 |
%x / %X | 十六进制无符号整数 | printf("%x", 255) → ff |
%u | 十进制无符号整数 | |
%f | 小数形式浮点数 | printf("%f", 3.14) → 3.140000(默认6位) |
%e / %E | 指数形式浮点数 | printf("%e", 3.14) → 3.140000e+00 |
%c | 单个字符 | printf("%c", 'A') → A |
%s | 字符串 | printf("%s", "hello") → hello |
%% | 输出百分号本身 | printf("%%") → % |
%p | 输出指针地址 |
格式修饰符
printf("%8d", 42); // " 42" 宽度8,默认右对齐
printf("%-8d", 42); // "42 " 宽度8,左对齐(-号)
printf("%08d", 42); // "00000042" 宽度8,左侧用0填充
printf("%.2f", 3.1415); // "3.14" 保留2位小数
printf("%8.2f", 3.1415); // " 3.14" 宽度8+2位小数格式修饰符总结
| 修饰符 | 含义 | 示例 |
|---|---|---|
m | 最小输出宽度 | %8d |
- | 左对齐(默认右对齐) | %-8d |
0 | 左侧用0填充 | %08d |
.n | 小数位数(浮点);字符串截取字符数 | %.2f |
l | 长整型/双精度 | %ld %lf |
二、scanf 格式化输入
scanf("格式控制字符串", &变量1, &变量2, ...);重要:
scanf的变量前必须加&(取地址符号),除非是指针或数组名!
常用格式符(与 printf 基本相同但有区别)
| 格式符 | 含义 | 注意 |
|---|---|---|
%d | 输入整数 | 对应 int |
%f | 输入单精度浮点数 | 对应 float |
%lf | 输入双精度浮点数 | 对应 double,不是 %f |
%c | 输入单个字符 | 会读入空格和换行 |
%s | 输入字符串 | 遇空格/Tab/换行即停止 |
scanf 常见问题
-
忘记
&:int a; scanf("%d", a); // 错误! scanf("%d", &a); // 正确 -
%c会读入换行符:scanf("%d", &n); scanf("%c", &ch); // ch 可能读到了上次留下的 '\n'! // 解决方法:scanf(" %c", &ch); (在%c前加空格) -
%s不能读取含空格的字符串:scanf("%s", str); // 输入 "hello world",只读到 "hello" // 应使用 gets() 或 fgets() 读取带空格字符串 -
格式控制字符串中除格式符外的字符需要原样输入:
scanf("%d,%d", &a, &b); // 必须输入 "3,5"(中间加逗号) scanf("%d%d", &a, &b); // 输入 "3 5" 或 "3\n5"
三、字符专用输入输出
putchar —— 输出单个字符
putchar('A'); // 输出 A
putchar('\n'); // 输出换行
putchar(ch); // 输出字符变量 ch 的值getchar —— 输入单个字符
char ch;
ch = getchar(); // 从键盘读取一个字符(包括空格和换行)
getchar()返回的是int类型(可以判断 EOF),但通常直接赋值给char。
四、字符串输入输出
puts —— 输出字符串并自动换行
puts("Hello"); // 输出 Hello 并换行
puts(str); // 输出字符串变量后自动换行gets —— 输入一行字符串(包含空格)
char str[80];
gets(str); // 读取整行(含空格),以换行结束
// 注意:gets() 不会检查缓冲区大小,不安全注意:实际编程中用
fgets(str, sizeof(str), stdin)更安全,但考试通常考察gets。
作业示例
ex1-1:简单输入输出——带除零判断
#include<stdio.h>
int main()
{
int a,b;
printf("\n请输入a,b:");
scanf("%d%d",&a,&b);
if(b!=0)
printf("%d/%d=%d\n",a,b,a/b);
else
printf("除数不能为0!\n");
return 0;
}要点:
scanf("%d%d",&a,&b)可以连续输入两个整数(空格或换行分隔)- 在输出前应该判断除数是否为 0
&a、&b的&不能忘记
ex1-3-2:scanf + printf 组合
#include<stdio.h>
#include <windows.h>
int main()
{
SetConsoleOutputCP(CP_UTF8);
int age;
printf("你多大了?\n");
scanf("%d",&age);
printf("我 %d 岁。\n",age);
return 0;
}要点:
scanf等待用户输入,按回车后程序继续printf中使用%d输出变量的值SetConsoleOutputCP(CP_UTF8)是 Windows 平台解决中文乱码的方法(考试不要求)
ex4-1:getchar/putchar 实现大小写转换
#include<stdio.h>
int main()
{
char a,b;
printf("请输入一个大写字母:");
a=getchar();
putchar('\n');
b=a+32; // 转小写:ASCII 码 +32
printf("转换后的小写字母为:");
putchar(b);
putchar('\n');
return 0;
}要点:
getchar()读取一个字符(不需要&,因为赋值给char变量时直接是值)- 大小写转换:
'a' - 'A' = 32 putchar()输出单个字符
ex4-2:scanf 与浮点数计算
#include<stdio.h>
int main()
{
int height;
float stdweight;
printf("男人标准体重计算器:\n");
printf("请输入身高cm:\n");
scanf("%d",&height);
stdweight=(height-100)*0.9;
printf("标准体重:%.2fkg",stdweight);
return 0;
}要点:
scanf("%d", &height)输入整数printf("%.2f", stdweight)输出浮点数,保留 2 位小数float和int混合运算时,int自动转为float
作业重点
printf格式符:%d(int)、%f(float)、%lf(double)、%c(char)、%s(字符串)、%o(八进制)、%x(十六进制)scanf变量前必须加&(数组名和指针除外)scanf输入double用%lf(不是%f)getchar()/putchar()处理单个字符,不需要格式符%.2f控制小数位数,%8d控制输出宽度scanf中%c会读取任何字符(包括空格和换行符)gets()可读取含空格的字符串但不够安全