☰
第4章 顺序结构与输入输出
2026/10/30 4:53:27 网站建设 项目流程
  1. printf常用格式符:%d十进制 int;%o八进制(不输出前导 0);%x/%X十六进制(不输出 0x);%c字符;%s字符串;%f浮点默认保留6 位小数;%%输出一个百分号。
  2. printf 常用格式字符:%d(十进制整型)、%o(八进制)、%x(十六进制)、%u(无符号十进制)、%c(单个字符)、%s(字符串)、%f(小数形式实型,默认6 位小数)、%e(指数形式)、%%(输出一个百分号)
  3. %m.nf:m 总宽度(含小数点),n 小数位数;宽度不够左侧补空格;超出则按实际输出。
  4. scanf普通变量前面必须加取地址符&;数组名本身是首地址,不要加&。
  5. scanf:float用%f;double输入必须用%lf,输出可以用%f。
  6. scanf格式串中普通字符必须原样输入;"%d,%d"输入必须带逗号。
  7. %d、%f自动跳过空格、回车、Tab 空白;%c不会跳过空白,会读取回车、空格字符。
  8. getchar()读取包括回车、空格在内的任何字符;;常用于吃掉缓冲区残留回车;返回值是int,用来接收EOF。
  9. scanf多数据输入默认以空白字符(空格、回车、Tab)分隔:scanf("%d%d", &a, &b);输入3 5、3↵5、3Tab5均可;%c之间不会自动跳过空白,每个字符都原样读取。
  10. 转义字符:\n换行、\t制表、\\反斜杠、\'单引号、\"双引号、\0空字符、\ddd1~3位八进制ASCII、\xhh1~2位十六进制ASCII
  11. 顺序结构:代码从上到下依次执行,无跳转。

!!! 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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询