【问题标题】:printf format parameter contain undefined escape characterprintf 格式参数包含未定义的转义字符
【发布时间】:2013-09-14 03:43:42
【问题描述】:
#include <stdio.h>

int main()
{
   printf("Hello\c!\n");
   return 0;
}

输出:Helloc!

所以,当\[some_undifined_symbol] 出现在printf 的格式字符串中时,它只是忽略了\

【问题讨论】:

  • 这是一个词法错误,它的处理取决于编译器。
  • @MarcinŁoś 表示这是一种未定义的行为?
  • gcc 说 警告:未知转义序列:'\c'
  • 这与printf()无关,它使用%作为其格式说明符。
  • @unwind 同意。 const char *s = "Hello\c!\n" 也会出现同样的问题

标签: c string escaping printf


【解决方案1】:

\c 不是已经定义的转义序列,但最好避免使用它,因为它是保留的:

C99 §6.11.4 字符转义序列

小写字母作为转义序列是为将来的标准化保留的。其他 字符可以在扩展中使用。

【讨论】:

  • 我无法从标准中找到确切的引用,但我怀疑使用保留的转义序列是未定义的行为(当您重新定义保留的标识符时会发生这种情况)。
  • 这里是报价:Escape sequences in which the character following the backslash is not listed in Table 7 are conditionally-supported, with implementation-defined semantics. (§2.14.3/3)
  • @MarcinŁoś 我在 C++11 中查找了您引用的部分,因此在 C++ 中定义了实现。但我仍然无法使用 C 标准。
  • @Yu Hau - 是的,问题是关于 C 的,抱歉。
  • 看来 \c 不是简单的“c-char-sequence”(6.4.4.4),在“Hello\c!\n”中无效”。 \c 没有被列为转义序列,尽管它看起来像一个。
【解决方案2】:

您为c 定义了以下转义序列:

  • \'单引号
  • \"双引号
  • \\ 反斜杠
  • \0 空字符
  • \a铃声
  • \b退格
  • \f 换页 - 新页面
  • \n 换行 - 换行
  • \r回车
  • \t水平制表符
  • \v垂直制表符
  • \nnn任意八进制值
  • \xnn任意十六进制值

【讨论】:

  • 以下也是C转义序列\?\uXXXX\UXXXXXXXX。 X 是一个十六进制值。
猜你喜欢
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2023-03-25
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多