【发布时间】:2024-01-07 02:33:01
【问题描述】:
如果我想让一个程序有多种文本输出格式,我可以这样做:
const char *fmtDefault = "%u x %s ($%.2f each)\n";
const char *fmtMultiLine = "Qty: %3u\nItem: %s\nPrice per item: $%.2f\n\n";
const char *fmtCSV = "%u,%s,%.2f\n";
const char *fmt;
switch (which_format) {
case 1: fmt = fmtMultiLine; break;
case 2: fmt = fmtCSV; break;
default: fmt = fmtDefault;
}
printf(fmt, quantity, item_description, price);
由于价格是最后指定的,我还可以添加一个不列出价格的:
const char *fmtNoPrices = "%u x %s\n";
但是如果我想省略数量呢?如果我这样做:
const char *fmtNoQuantity = "The price of %s is $%.2f each.\n";
然后会发生未定义的行为(很可能是段错误),而不是我想要的。这是因为它将第一个参数视为指向字符串的指针,即使它实际上是一个无符号整数。这个 unsigned int 很可能指向有效字符串数据以外的其他内容,或者(更有可能,特别是如果您不购买数亿件相同商品)无效的内存位置,从而导致分段错误。
我想知道是否有一个代码可以放在某处(在此示例中为%Z)来告诉它跳过该参数,如下所示:
const char *fmtNoQuantity = "%ZThe price of %s is $%.2f each.";
【问题讨论】:
-
scanf() 可以使用星号,但 IIRC printf() 不能。我也尝试过使用
.0精度说明符,但这似乎只适用于字符串(%.0s将不显示任何内容,但如果不为空,可能仍会取消引用指针) -
我认为,您应该使用带有单独参数列表的单独调用集。否则会使国际化 (I18N) 变得更加困难。
标签: c text formatting printf output