如何在Guile的format中以参数形式指定填充长度(如Bash printf)?
嘿,这个问题我刚好折腾过!在Guile的format里,完全能实现像Bash printf那样用传入参数动态指定填充长度,主要有两种实用方式,给你拆解清楚:
1. 用*直接引用后续参数作为宽度
这种写法和Bash的%*s逻辑几乎一致,*会自动取紧跟在格式说明符后面的参数作为填充宽度。举几个例子:
; 输出占5位的字符串(刚好长度匹配,直接输出) (format #t "%*s\n" 5 "hello") ; 输出占10位的"hi",默认右对齐,前面补8个空格 (format #t "%*s\n" 10 "hi") ; 左对齐版本,"hi"后面补8个空格 (format #t "%-*s\n" 10 "hi")
2. 用v修饰符指定任意位置的参数作为宽度
如果你的宽度参数不是紧跟在格式说明符后面,或者需要复用某个参数作为宽度,就可以用v修饰符加上参数索引(注意Guile的参数索引是从1开始的)。比如:
; 用第2个参数(5)作为宽度,格式化第1个参数"hello" (format #t "%v2s\n" "hello" 5) ; 用第3个参数(8)作为宽度,左对齐格式化第1个参数"foo" (format #t "%-v3s\n" "foo" "bar" 8)
额外补充:动态指定精度
如果是处理数字精度或者字符串截断长度,同样可以用*或v来实现动态控制:
; 宽度8,精度3,格式化整数123(精度表示最小位数,不足补0) (format #t "%*.*d\n" 8 3 123) ; 宽度10,截取字符串前3个字符,右对齐输出 (format #t "%*.*s\n" 10 3 "hello")
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

