【问题标题】:C string contain modulo [duplicate]C字符串包含模[重复]
【发布时间】:2013-12-14 17:37:41
【问题描述】:

我尝试使用反斜杠转义它。

#include <stdio.h>

int main(void) {
    printf("\%");
    return 1;
}

但它不起作用。正确的语法是什么?

【问题讨论】:

标签: c string modulo


【解决方案1】:

Two percentage signs:

printf("%%");

【讨论】:

  • 谢谢。我想知道为什么它不遵循与常规转义相同的模式。
  • @Jimmay,因为它与转义无关。它与printf 如何处理格式说明符有关。转义对所有字符串都有效,并且在编译时完成。格式说明符(百分号)仅由某些函数使用并在运行时使用。如果您将write 转换为stdout,则无需使用双百分号。
  • puts 可能是一个更好的例子:它只是将给定的字符串打印到stdout 而不对其进行任何处理。
【解决方案2】:
 printf("\%");  

如果您在 C89 模式下编译它,将打印 %(在 K&R C 中,它是行为定义)。
在 C99/11 中这是无效的。

C11:6.4.4.4 字符常量:

双引号" 和问号? 可以单独表示,也可以分别用转义序列\"\? 表示,但单引号' 和反斜杠@987654330 @ 应分别由转义序列\'\\ 表示。

确认没有像\%这样的转义序列。
首选方式是

  printf("%%");   

questionanswered here 几乎相似。

【讨论】:

  • 我更喜欢\%的样子,所以现在我编译成K&R。谢谢。
  • 您确定printf("\%") 是有效的K&R C 吗?当然,字符串常量本身是有效的,并且与"%" 相同,但我很确定,对printf 的调用不是,因为"%" 不是有效的格式说明符(至少在C99 中,使用无效格式规范的行为未定义 (C99 §7.19.6.1(9))。但很遗憾,我这里没有 K&R 书来验证这一点。
  • @hacks 非常感谢您的链接!因此,根据您的链接,这在 K&R 中显然是未定义的,并且第二版的附录没有提到这与第一版的不同。
猜你喜欢
  • 2019-11-09
  • 2012-11-14
  • 2019-09-22
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多