作者Ayuang (Ayuang)
看板C_and_CPP
标题[问题] 关於sprintf格式化 %%%ds的问题
时间Fri Apr 7 21:14:19 2017
问题(Question):
这是在
https://openhome.cc/Gossip/AlgorithmGossip/PascalTriangle.htm看到的题目
,是关於巴斯卡三角形的运算并排列。里面的程式码大部分小弟都看得懂,但在sprintf
里有一个%%%ds的格式化符号实在是不懂它的功能,以前也没看过这样子的打法;还请版
上高手能替小弟解答,感激不尽。
程式码(Code):
#include <stdio.h>
#define HEIGHT 12
int combi(int r, int n){
int p = 1;
int i;
for(i = 1; i <= n; i++) {
p = p * (r - i + 1) / i;
}
return p;
}
int main() {
int r;
for(r = 0; r < HEIGHT; r++) {
char format[5];
sprintf(format, "%%%ds", (HEIGHT - r) * 3);
printf(format);
int n;
for(n = 0; n <= r; n++) {
printf("%6d", combi(r, n));
}
printf("\n");
}
return 0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 163.18.30.156
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1491570871.A.B17.html
1F:推 x000032001: %%印出% %d出整数 s就是s 04/07 21:16
2F:→ x000032001: 跟下面那行一起看就是印出(HEIGHT-r)*3个空白 04/07 21:20
3F:→ Ayuang: x000032001 所以%s不给变数的话就会输出空白吗? 04/07 21:31
4F:推 LPH66: 唔嗯...我感觉印空白是 UB, 至少也要摆个 "" 04/07 22:45
5F:→ LPH66: 查了一下没错, va_arg 在没参数时硬叫是未定义行为 04/07 22:50
6F:→ x000032001: 原文好像有"" … 04/07 22:50
7F:→ LPH66: 所以正确的写法应该是 printf(format,""); 04/07 22:50
8F:→ LPH66: 不过这里其实可以不用这麽间接的方式 04/07 22:51
9F:→ LPH66: printf 系的格式字串可以在需要数字时放 * 字 04/07 22:51
10F:→ LPH66: 这个 * 字实际上是多少由下一个 int 决定 04/07 22:51
11F:→ LPH66: 所以这里可以写 printf("%*s",(HEIGHT-r)*3,""); 04/07 22:52
12F:→ LPH66: 达到一样的效果 04/07 22:52
13F:→ Ayuang: LPH66 我刚刚有是过去掉print里的" ",效果一样 04/07 23:17
14F:→ Ayuang: 还是很谢谢两位为我解答,这打法真的很有意思。 04/07 23:19
15F:推 ilikekotomi: 长知识了 以前都没注意到有%*s的用法 感谢LPH66大大 04/07 23:47
16F:推 CoNsTaR: %%%%%% 04/08 05:05
17F:推 dmeiki: 长知识 04/08 23:43
18F:推 Hazukashiine: %.*s 有一个点 04/09 03:32
19F:推 EdisonX: 可以不用%.*s , 那个 dot 多用在浮点数,如 %*.*lf 04/09 11:42
21F:→ Hazukashiine: 有那个的点点才能 truncate 所以 〃*.*s〃 也是对的 04/09 12:26
24F:推 EdisonX: 这招到还没用过,谢谢。 04/09 20:51
26F:推 LPH66: 嗯, 上面推文没提 . 是因为原文写法就不是用 . 的 04/10 02:43
27F:→ LPH66: * 字可以取代数字所以 %*.*s 这个写法可以直接定死输出长度 04/10 02:44
28F:→ LPH66: 不论实际上的字串有多长; 原文只是要印空白所以不用 . 04/10 02:44