【现代C++】原始字符串-raw string literal

栏目: C++ · 发布时间: 5年前

内容简介:今天说一个C++11 引入一个小但非常有用的特性--原始字符串(raw string literal)。在每个程序中,几乎都应用到字符串字面量。但传统的字符串字面量的语法对带有特殊字符的字面量的支持不友好,它引入了一些转义字符来表示字符串中这些特殊的字符,如:如果能直接表示成

今天说一个C++11 引入一个小但非常有用的特性--原始字符串(raw string literal)。

背景

在每个程序中,几乎都应用到字符串字面量。但传统的字符串字面量的语法对带有特殊字符的字面量的支持不友好,它引入了一些转义字符来表示字符串中这些特殊的字符,如:

\a 响铃(BEL)
\b 退格(BS)
\f 换页(FF)
\n 换行(LF)
\r 回车(CR)
\t 水平制表(HT)
\v 垂直制表(VT)
\\ 反斜杠
\? 问号字符
\' 单引号字符
\" 双引号字符
\0 空字符(NULL)

这所带来的问题对于简单的字符串并不算大,但对一些特殊的应用明显不给力,比如,正则表达式:

\\d{3}-\\d{8}|\\d{4}-\\d{7}

因为正则表达式大量使用了 \ ,而反斜杠被用来作为转义序列的开始,所以在字符串中需要使用 \\ 进行转义,这种语法虽然能解决问题,明显,可读性是非常差的。若应用场景再复杂点,估计很多人为了数清楚反斜杠得耗掉不少的时间。

如果能直接表示成 \d{3}-\d{8}|\d{4}-\d{7} ,该有多好!

语法

C++11 终于行动了,引入了原始字符串。最基本的用法是 R"(...)" ,由 R 开头,双引号内包围着 (...) ,实际的字符序列是小括号内的内容,小括号是字符序列的定界符。当然,左小括号和右小括号是首位对应的。

“原始”(raw)体现在字符串里的字符一就是一,二就是二,不会给你转义。也就是说,传统的 "\n" 除了字符串结尾符,仅包含换行符,而原始字符串 R"(\n)" 则包含反斜杠和字符 n ,这是明显的不同。

从现在来看,貌似已经很好的解决问题了,但如果字符序列里包含 )" ,如 R"(坐标: "(x,y)")" ,此时编译器是懵的,因为 "( 对应了两个 )" 。在这种情况下,我们可以选择其他定界符,如, R"&(坐标: "(x,y)")&" 。语法如下:

R"delim(...)delim"delim 的选取比较灵活,最长不超过16个字符,且不为小括号、空白、控制字符和反斜杠。

应用

背景中给了原始字符串在正则表达式的应用,但其应用场景不止于此,比如:

  • Windows文件路径

R"(C:\ProgramFiles\xx\xx\xx.exe)"

  • Json字符串

R"({"name":"xx","age":10})"

例子

在洛谷的第一道题:

【现代C++】原始字符串-raw string literal

这道题可以使用其他技巧解答,这里仅给出使用原始字符串的解法:

#include<iostream>

int main() {
    std::cout << R"(                ********
               ************
               ####....#.
             #..###.....##....
             ###.......######              ###            ###
                ...........               #...#          #...#
               ##*#######                 #.#.#          #.#.#
            ####*******######             #.#.#          #.#.#
           ...#***.****.*###....          #...#          #...#
           ....**********##.....           ###            ###
           ....****    *****....
             ####        ####
           ######        ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
##########################################    #----------#
#.....#......##.....#......##.....#......#    #----------#
##########################################    #----------#
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
##########################################    ############ )";
}

通过上面的例子,我们也能发现原始字符串的另外两个优点:

  1. 换行能很好的保留
    其他方式都需要人工加 \n 实现换行。
  2. 方便拷贝字符串
    将拷贝的字符串直接替换 R"(...)" 中的 ... ,任务就完成了,非常方便。而其他方式,都需要过多的干预拷贝的字符串,非常容易出错。

请继续关注我的公众号文章

【现代C++】原始字符串-raw string literal


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

社会工程

社会工程

海德纳吉 (Christopher Hadnagy) / 陆道宏、杜娟、邱璟 / 人民邮电出版社 / 2013-12 / 59.00元

本书首次从技术层面剖析和解密社会工程手法,从攻击者的视角详细介绍了社会工程的所有方面,包括诱导、伪装、心理影响和人际操纵等,并通过凯文 · 米特尼克等社会工程大师的真实故事和案例加以阐释,探讨了社会工程的奥秘。主要内容包括黑客、间谍和骗子所使用的欺骗手法,以及防止社会工程威胁的关键步骤。 本书适用于社会工程师、对社会工程及信息安全感兴趣的人。一起来看看 《社会工程》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具