如果我想让一个程序有多种文本输出格式,我可以这样做:
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.";
最佳答案
对于 %s
值,有一个“null” printf() 代码:%.0s
。
您可以通过以下方式找到通用解决方案:
如果可能,重新排列以使 non-%s
值在最后,然后在下面指定格式字符串。
我最喜欢的是有 3 个单独的 printf() 调用,每个值使用自己的格式一个。当不需要该值时,只需提供不带说明符的格式字符串。
const char * Format1q = "";
const char * Format1id = "The price of %s";
const char * Format1p = " is $%.2f each.\n";
...
printf(Format1q, quantity);
printf(Format1id, item_description);
printf(Format1p, price);
奇怪的解决方案:
对于其他大小相同的值,您可以尝试也使用 %.0s
的未定义行为。 (在 gcc 4.5.3 中使用了一些示例,谁知道其他编译器或 future 。)
对于 N x 与指针大小相同大小的其他值,您可以尝试也使用 %.0s
N 次的未定义行为。 (在 gcc 4.5.3 中使用了一些示例,谁知道其他编译器或 future 。)
关于c - 是否有 "null"printf 代码不打印任何内容,用于跳过参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16706611/
相关文章:
python - 如何在 python sysloghandler 中设置自定义应用程序名称
c# - Visual Studio 2013 丢失代码格式,C#
xml - HTML 之于 HAML 就像 XSLT 之于 ...?
python - 是否有 matplotlib.ticker.LogFormatterSciNota
sql-server-2005 - 在 SQL Reporting 2005 中更改货币符号
netbeans - NetBeans 中是否有任何隐藏的 Javascript 代码格式设置?