C ++将wchar_t反斜杠插入到字符串中

时间:2014-07-02 13:04:35

标签: c++ string escaping string-literals

我有一个广泛的字面文字:

const wchar_t* charSet =  L" !\"#$%&'()*+,-./0123456789:;<=>?\n"
                                L"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\n"
                           L"`abcdefghijklmnopqrstuvwxyz{|}~\n";

当我将它传递给文本处理器'\'时(反斜杠)不存在。现在如果我把它改为\\ it

我收到编译时错误:

  

“缺少收尾报价”

那么如何将反斜杠放入这样的字符串中呢?

1 个答案:

答案 0 :(得分:2)

至于您的原始代码

L" !\"#$%&'()*+,-./0123456789:;<=>?\n"

您只是错过了再次转义引号字符"。添加另一个\您将获得

L" !\\"#$%&'()*+,-./0123456789:;<=>?\n"

此时未转义的"关闭了文字。 "的下一次出现将打开一个新的文字,但它不平衡,因此编译错误信息(你甚至可以在这里的代码标记中发现效果)。您需要再添加\以再次转义"

L" !\\\"#$%&'()*+,-./0123456789:;<=>?\n"
//  ^^^ Fix this

但是,管理与\反斜杠和"引号字符混合的转义字符非常难以阅读并保持更改。

自最新标准()起,您可以使用raw character string literals

#include <iostream>
#include <string>

int main() {
    std::wstring ws(LR"del( !\"#$%&'()*+,-./0123456789:;<=>?)del" L"\n"
                    LR"del(@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_)del" L"\n"
                    LR"del(`abcdefghijklmnopqrstuvwxyz{|}~)del" L"\n");
    std::wcout << ws;
    return 0;
}

输出

 !\"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
`abcdefghijklmnopqrstuvwxyz{|}~

不需要逃避,你知道。

有关支持当前标准的编译器,请参阅工作示例herehere