如果我想要一个程序有多种文本输出格式,我可以这样做:
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";
那么将会发生未定义的行为(很可能是段错误),而不是我想要的。这是因为它会将第一个参数视为指向字符串的指针,即使它实际上是一个无符号整数。这个无符号整型很可能指向除有效字符串数据之外的其他内容,或者(更有可能,特别是如果您没有购买数亿个相同的项目)无效的内存位置,从而导致分段错误。
我想知道是否有一个代码我可以放在某个地方(%Z
在此示例中)告诉它跳过该参数,如下所示:
const char *fmtNoQuantity = "%ZThe price of %s is $%.2f each.";