C语言中 %* 的用法总结
一、scanf 中的 %*
二、printf 中的 %*
- 作用:动态控制输出的宽度或精度(通过参数传递值)。
- 语法:
| 格式符 | 参数顺序 | 作用 |
|---|
%*d | (宽度, 数值) | 按动态宽度输出整数 |
%.*f | (精度, 数值) | 按动态精度输出浮点数 |
%*.*f | (宽度, 精度, 数值) | 动态控制宽度和精度 |
- 规则:
- 宽度不足:自动扩展,不截断数值。
- 负宽度:表示左对齐(如
%-5d → 10 )。
- 示例:
int width = 6, precision = 2;
printf("|%*d|", width, 10);
printf("|%.*f|", precision, 3.1415);
printf("|%*.*f|", 6, 2, 3.1415);
三、关键区别与易错点
| 场景 | scanf 的 %* | printf 的 %* |
|---|
| 核心作用 | 跳过输入字段 | 动态控制输出格式 |
| 参数顺序 | 无需额外参数 | 必须按顺序传参(如先宽度后值) |
| 常见错误 | 输入格式不匹配导致跳过失败 | 参数顺序错误(如 %*d 写成 %d*) |
| 特殊符号 | 无 | 负宽度表示左对齐(%-5d) |
四、记忆口诀
scanf 的 *:读入数据跳过不留,省去变量不用愁。printf 的 *:宽度精度动态调,参数顺序别颠倒。
五、对比示例
| 函数 | 代码 | 输入/输出 | 结果 |
|---|
scanf | scanf("%d-%*d-%d", &a, &b); | 输入 2023-10-05 | a=2023, b=5 |
printf | printf("%*d", 5, 10); | 输出 | 10(宽度5) |
printf | printf("%.*f", 2, 3.1415); | 输出 | 3.14(精度2) |
总结:%* 在 scanf 中是“跳过输入”,在 printf 中是“动态格式控制”。核心区别在于参数传递和作用方向(输入 vs 输出)!