微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有一个“null”printf代码,不打印任何东西,用于跳过参数?

如果我想要一个程序有多种文本输出格式,我可以做这样的事情:
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.这个unsigned int很可能指向除有效字符串数据之外的其他内容,或者(更有可能,特别是如果您不购买数亿个相同项目)无效的内存位置,从而导致分段错误.

我想知道的是,如果有一个代码我可以放在某个地方(本例中为%Z)告诉它跳过该参数,如下所示:

const char *fmtNoQuantity = "%ZThe price of %s is $%.2f each.";

解决方法

对于%s值,有一个“null”printf()代码:%.0s.

您可以通过以下方式获得一般解

如果可能,重新排列以使非%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中的一些样本,谁知道在其他编译器或未来.)

对于N x与指针大小相同的其他值,您可以尝试使用%.0s N次的未定义行为. (使用gcc 4.5.3中的一些样本,谁知道在其他编译器或未来.)

原文地址:https://www.jb51.cc/c/119268.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐