当前位置: 首页 > news >正文

c++之原始字符串字面量(raw string-literals)

基础介绍

在c++11版本引入了一个特性(raw string literals)字符串字面量,这个特性的引入解决了在c++字符串中如果包含类似换行符、指标、单个反斜杠、转义字符等可以以人们更能理解的方式去使用,而传统的携带这些字符串的字符串需要将这些字符显式的写到字符串中。官方的解释可能更清楚:

来自转义序列的字符(制表符、换行符、单个反斜杠等)可以以原始形式输入,同时保持格式化。这在编写包含大量引号或特殊格式的文本时特别有用。这可以使你的字符串字面量更容易阅读和维护。

语法

 R"delimiter(raw_characters)delimiter"

 这里使用这个特性需要记住几点:

  1. 一定是R""的形式
  2. delimiter的中文意思是分隔符的意思,一般情况下分割符为空,仅使用()即可
  3. 中间部分raw_characters是具体的字符串
  4. 如果raw_characters中包含(或),那么就需要自己独立定义分隔符,注意分隔符不会加入的raw_characters中,仅仅是用于标识字符串的开头和结束。

请看下面的例子说明特殊分隔符

// 自定义分隔符
std::string custom = R"---(Hello "world" with (parentheses))---";

//std::cout<<custom<<std::endl;

//输出"Hello "world" with (parentheses)"

上面的例子中raw_characters中包含了(和),如果按照默认的分隔符无法分辨出字符串从哪里开始的,所以自定义分隔符---,通过这个分隔符可以知晓字符串从哪里开始的。

详细解释和实例

//传统的字符串写法
std::string Tranditional = "First line\nSecond line\tTabbed";

//采用原始字符串字面量的写法
std::string raw = R("First line
Second line    Tabbed");

通过上面的例子可以看到,采用新特性“原始字符串字面量”可以以原始形式输入,同时保持格式化,更方便人们阅读和理解程序的含义。

主要用途

  • 文件路径:在传统方式中表示路径需要用到转换以字符\\,用于路径的反斜杠;采用新的方式则不需要使用转义字符串。
// 传统方式
std::string path1 = "C:\\Users\\Name\\Documents\\file.txt";

// 原始字符串方式
std::string path2 = R"(C:\Users\Name\Documents\file.txt)";
  • 多行文本
// 传统方式
std::string html1 = "<html>\n"
                   "    <body>\n"
                   "        <h1>Title</h1>\n"
                   "    </body>\n"
                   "</html>\n";

// 原始字符串方式
std::string html2 = R"(
<html>
    <body>
        <h1>Title</h1>
    </body>
</html>
)";
  • 正则表达式:与文件路径一样,需要使用转义字符\
// 传统方式
std::string regex1 = "\\w+\\s*\\=\\s*\\d+";

// 原始字符串方式
std::string regex2 = R"(\w+\s*\=\s*\d+)";

优点

  1. 可读性好
  2. 减少错误,可读性好的情况下对字符串处理当然会减少错误,否则字符串中携带一堆的转移字符,看上去眼花缭乱,密密麻麻的,当然更容易出错。

使用建议

推荐使用原始字符串字面量特性的的场景:

  • 文本路径
  • 多行文本
  • HTML/XML
  • JSON
  • 正则表达式
  • SQL查询

相关文章:

  • AOP进阶-03.切入点表达式-execution
  • LeetCode 热题100 226. 翻转二叉树
  • 【智能优化算法】文献阅读总结
  • IDE/Mermaid + VSCode + Deepseek 生成可视化流程图和UML图
  • 认证与授权#1#Token和Cookie验证方式对比
  • 二、IDE集成DeepSeek保姆级教学(使用篇)
  • 【AIGC系列】3:Stable Diffusion模型介绍
  • 文件缓冲区
  • ABC 394
  • 使用git管理uniapp项目
  • 轮式机器人在复杂地形中如何选择合适的全局路径规划算法?
  • 为什么办公电脑需要使用企业级杀毒软件?--火绒企业版V2.0
  • 在 macOS 系统上安装 kubectl
  • maven:Maven插件开发实践:动态依赖注入与架构演进说明
  • 快速排序(详解)c++
  • 【Java分布式】基本概念
  • 《模拟器过检测教程:Nox、雷电、Mumu、逍遥模拟器 Magisk、LSposed 框架安装与隐藏应用配置》
  • 模拟与数字电路 寇戈 第三节课后习题
  • 【计网】计算机网络概述
  • 记一次内存泄漏导致的线上超时问题
  • 习近平在中拉论坛第四届部长级会议开幕式的主旨讲话(全文)
  • 泽连斯基批准美乌矿产协议
  • 中共中央、国务院印发《生态环境保护督察工作条例》
  • 2025年上海好护士揭晓,上海护士五年增近两成达12.31万人
  • 何立峰:中方坚定支持多边主义和自由贸易,支持世界贸易组织在全球经济治理中发挥更大作用
  • 总导演揭秘十五运会闭幕式:赴一场星辰大海之约