- printf常用格式符:%d十进制 int;%o八进制(不输出前导 0);%x/%X十六进制(不输出 0x);%c字符;%s字符串;%f浮点默认保留6 位小数;%%输出一个百分号。
- printf 常用格式字符:%d(十进制整型)、%o(八进制)、%x(十六进制)、%u(无符号十进制)、%c(单个字符)、%s(字符串)、%f(小数形式实型,默认6 位小数)、%e(指数形式)、%%(输出一个百分号)
- %m.nf:m 总宽度(含小数点),n 小数位数;宽度不够左侧补空格;超出则按实际输出。
- scanf普通变量前面必须加取地址符&;数组名本身是首地址,不要加&。
- scanf:float用%f;double输入必须用%lf,输出可以用%f。
- scanf格式串中普通字符必须原样输入;"%d,%d"输入必须带逗号。
- %d、%f自动跳过空格、回车、Tab 空白;%c不会跳过空白,会读取回车、空格字符。
- getchar()读取包括回车、空格在内的任何字符;;常用于吃掉缓冲区残留回车;返回值是int,用来接收EOF。
- scanf多数据输入默认以空白字符(空格、回车、Tab)分隔:scanf("%d%d", &a, &b);输入3 5、3↵5、3Tab5均可;%c之间不会自动跳过空白,每个字符都原样读取。
- 转义字符:\n换行、\t制表、\\反斜杠、\'单引号、\"双引号、\0空字符、\ddd1~3位八进制ASCII、\xhh1~2位十六进制ASCII
- 顺序结构:代码从上到下依次执行,无跳转。
!!! 1:scanf漏写取地址符&
int a;
scanf("%d", a); // 把 a 的值当地址传入,运行时段错误,甚至崩溃
//普通变量必须传地址;数组名本身就是地址,不要加&。
int a;
char s[20];
scanf("%d", &a); // 整型:取地址
scanf("%s", s); // 数组名即首地址,无需 &
!!! 2:scanf中double错用%f(考研高频)
double d;
scanf("%f", &d); // 错:%f 对应 float(4 字节),向 8 字节 double 写 4 字节,读到垃圾值
正确是什么:scanf 输入 double 一律用%lf;输出用 %f(%lf 输出在 C99 后也合法,但习惯用 %f)。
scanf("%lf", &d); // 对
printf("%f", d); // 对
!!! 3:%c与%d/%s混用时的缓冲区残留
int a; char c;
scanf("%d", &a); // 输入 65 后按回车,回车符 '\n' 留在缓冲区
scanf("%c", &c); // c 直接读到 '\n',不是预期的字符
正确是什么:在 %c 前加一个空格吃掉空白字符,或先用 getchar() 清掉回车。
scanf("%d", &a);
getchar(); // 吃掉残留回车
scanf("%c", &c);
// 或:scanf(" %c", &c); %c 前的空格会跳过任意空白字符
!!! 4:printf格式字符与输出项类型不匹配
printf("%d", 3.14); // 用整型格式输出实型,结果是无意义的数
printf("%f", 100); // 用实型格式输出整型,同样错
格式与数据项类型必须对应,顺序一一对应、个数相等。
printf("%.2f", 3.14);
// 3.14%m.nf:m 总宽度(含小数点),n 小数位数;宽度不够左侧补空格;超出则按实际输出。
printf("%d", 100); // 100
??? 1:执行printf("%d%%%d", 3, 5);的输出为 ______。
错:填"35"——忽略了%%转义为字面百分号,输出项与格式控制并未按"两个 %d"对应。
正确:填3%5。%% 在格式串中表示输出一个 % 字符,不消耗输出项。
??? 2:scanf("%d,%d", &a, &b);要求输入时两个数之间必须用 ______ 分隔。
错:填"空格或回车均可"——格式串中写死了逗号,非空白通用分隔;若输入 3 5 则 b 读不到,a=3、b 保持原值。
正确:填逗号。scanf 格式串中的普通字符(非 % 开头)必须原样匹配输入,常见写法 "%d,%d"(输入 3,5)或 "%d %d"(输入 3 5)。
??? 3:float f = 3.14159; printf("%.2f", f);的输出是 ______。
正确:填 3.14。%.2f 表示保留 2 位小数,第三位四舍五入。
定义int a; long b; double x;,则scanf语句正确的是__A____。
A.scanf("%d%ld%lf", &a, &b, &x);
B.scanf("%d%d%f", a, b, x);
C.scanf("%d%ld%f", &a, &b, &x);
D.scanf("%d%ld%lf", &a, &b, x);
执行printf("%3d|%-3d|", 5, 5);的输出为_5|5|_____。(提示:-表示左对齐)
%3d:占 3 个字符宽度,右对齐,数字 5 前面补两个空格 → 5
%-3d:占 3 个字符宽度,左对齐,数字 5 后面补两个空格 → 5
%03d:0 是标志,3 是宽度;用 0 填充空位
printf("%03d", 1234); // 1234,数字超过宽度就原样输出,不会截断
%.3d:.3 是精度,对整数代表最少输出几位数字,不够补前导 0;超出原样输出
printf("%.3d", 1234); // 1234
格式 | 含义 | a=6 输出 | b=1234 输出 (易错) | 易错点 |
%3d | 宽度 3,右对齐,空格前置填充 | 6 | 1234 | 数值位数>宽度,不截断,原样输出 |
%-3d | 宽度 3,左对齐,空格后置填充 | 6 | 1234 | -只控制对齐,不能和 0 填充同时生效 |
%03d | 宽度 3,右对齐,0 前置填充 | 006 | 1234 | 0 填充只补空位,数字太长直接原样输出 |
%.3d | 整数精度:最少 3 位数字,不足补前导 0 | 006 | 1234 | .3是精度≠宽度; 对小数是控制小数位 |
printf("%-03d",6);错:006左对齐-和 0 填充标志冲突,0 标志失效→6;
printf("%.3f", 6.1234);%.nd 对整数是最少位数;%.nf 对浮点数是保留 n 位小数,完全两回事!6.123
printf("%5.3d",7);总宽度 5,整数精度 3→需要至少 3 位数字→007,占 3 字符;总宽 5,右对齐前面补 2 空格
printf("%5.3f", 2.5);2.500