我创造了一个新的项目,与以下代码段:

char* strange = "(Strange??)";
cout << strange << endl;

造成下列产出:

(奇怪的]

因此翻译'??)' -> ']'

调试这表明,我char*字符串的实际价值和它不是一个流行翻译。这显然是不元字符序列。某种Unicode或广字符序列也许?我不这么认为但是...我已经试过了禁止所有相关项目设置无济于事。

任何人都有一个解释吗?

  • 搜索:'的问题的标记,标记问题,靠近撑'c++字符串
有帮助吗?

解决方案

你看到的是被称为 三元组.

在书面语言的成年人,一个标记问题是充足的任何情况。不用多于一次一个,你永远不会看见这个了。

海湾合作委员会忽略了对三字符组通过默认,因为几乎没有人使用他们的故意。启用它们 -trigraph 选择,或告诉编译器警告你关于他们的 -Wtrigraphs 选项。

视觉C++2010还禁止他们默认情况下提供 /Zc:trigraphs 以使他们。我找不到任何有关方面启用或禁用他们在以前的版本。

其他提示

简单的方法来避免这三元组吃惊的是:拆分"??" 字符串中的两个:

char* strange = "(Strange??)";
char* strange2 = "(Strange?" "?)";
/*                         ^^^ no punctuation */

编辑
海湾合作委员会有一个选项,以警告有关对三字符组: -Wtrigraphs (启用 -Wall 还)
终编辑

报价的标准

    5.2.1.1 Trigraph sequences
1   Before any other processing takes place, each occurrence of one of the
    following sequences of three characters (called trigraph sequences13))
    is replaced with the corresponding single character.
           ??=      #               ??)      ]               ??!      |
           ??(      [               ??'      ^               ??>      }
           ??/      \               ??<      {               ??-      ~
    No other trigraph sequences exist. Each ? that does not begin one of
    the trigraphs listed above is not changed.
    5.1.1.2 Translation phases
1   The precedence among the syntax rules of translation is specified by
    the following phases.
         1.   Physical source file multibyte characters are mapped, in an
              implementation-defined manner, to the source character set
              (introducing new-line characters for end-of-line indicators)
              if necessary. Trigraph sequences are replaced by corresponding
              single-character internal representations.

这是一个 三元组!

??) 是一个 三元组.

那是 三元组 支持。你可以防止三元组的解释通过逃脱的任何特点:

char* strange = "(Strange?\?)";

这是一个 三元组.

对三字符组 是的原因。谈C在该条也适用于C++

正如多次提到,你被咬了一个三元组.看看这前所问题的更多信息:

你可以解决这个问题通过使用'\?'逃生顺序'?'的角色:

char* strange = "(Strange\?\?)";

事实上,这是因为这个原因逃生顺序,这是有点神秘如果你不知道那些该死的对三字符组的.

同时试图跨汇编关于海湾合作委员会,它拿了我的序列作为一个 三元组:

所以我现在需要做的是找出如何禁止此项目通过默认,因为我只能看到它造成一些问题,对我来说。(我使用我们的键盘布局无论如何)

默认行为,关于海湾合作委员会被忽略,但得到一个警告,这是更为理智的和确实是什么Visual Studio2010年将通过如标准作为我所知道的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top