如果我想要一个程序有多种文本输出格式,我可以这样做:
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.";