未知的meta-character C/C++字符串?
-
13-09-2019 - |
题
我创造了一个新的项目,与以下代码段:
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年将通过如标准作为我所知道的。