解读C++11 原生字符串

所属分类: 软件编程 / C 语言 阅读数: 111
收藏 0 赞 0 分享

1.基本概念与作用

原生字符串(Raw String)指不进行转义“所见即所得”的字符串。很多编程语言早已支持原生字符串,如C#、Python、Shell等。C++作为一门高级程序设计语言,自然不能自甘落后,从C++11开始,C++也开始支持原生字符串。

很多时候,当我们需要一行字符串的时候,字符串转义往往成了一个负担,写和读都带了很大的不便。例如,对于如下路径”D:\workdataDJ\code\vas_pgg_proj”,我们必须通过反斜杠进行转义,把它写成如下形式:

string path = "D:\\workdataDJ\\code\\vas_pgg_proj";

可能你会说这个并没有多大影响,但当我们使用正则表达式时,由于正则表达式中特殊字符(如反斜杠、双引号等)较多,再使用反斜杠进行转义,那么正则表达式的可读性将变得很差,形如下面的一条正则表达式

string re = "('(?:[^\\\\']|\\\\.)*'|\"(?:[^\\\\\"]|\\\\.)*\")|";

在C#中,我们可以通过@关键字来取消字符串转义。在C++ 11中,它的非转义形式为:

string path = R"(D:\workdataDJ\code\vas_pgg_proj)";

从上面的例子中可以看出,C++的语法格式如下:

(1)字符串前加R前缀;
(2)字符串首尾加上小括号;

它的语法格式比C#的@前缀要稍微复杂点,不过这个复杂也有复杂的好处,那就是字符串里面可以带双引号。

string path = R"(this "word" is escaped)";

而C#就无法保持原始字符串格式,对双引号仍需要转义:

string path = @"this ""word"" is escaped";

2.原生字符串与Unicode字符串结合

由于C++11对Unicode的支持,原生字符串的定义方式可以与Unicode字符串结合使用,定义UTF-8、UTF-16和UTF-32的原生字符串,将其前缀分别设置为u8R、uR和UR即可。有一点需要注意,使用了原生字符串,转义字符就不能再使用了,这会给使用\u或者\U的方式书写Unicode字符的程序带来一定影响。参看下面的例子。

#include <iostream> 
using namespace std;

int main()
{
cout<<u8R"(\u4F60,\n
\u597D)"<<endl;
cout << u8R"(你好)" << endl;
cout << sizeof(u8R"(hello)") << "\t" << u8R"(hello)" << endl;
cout << sizeof(uR"(hello)") << "\t" << uR"(hello)" << endl;
cout << sizeof(UR"(hello)") << "\t" << UR"(hello)" << endl;
}

程序输出结果:

\u4F60,\n
\u597D
你好
6 hello
12 00C03174
24 00C03180

从结果可以看出,使用\u定义Unicode字符时,未能如果异常,输出原生字符串的模样。在使用sizeof运算符计算不同编码的相同字符串时,得到的结果是不通的,大小跟其申明的类型是完全一致的。注意在使用cout对UTF-16和UTF-8编码的字符串进行输出时,输出的是字符串地址。

3.原生字符串的连接

C++中同样可以将原生字符串进行连接,但不要将不同编码的字符串进行连接,因为C++尚不支持这种做法。考察如下代码:

#include <iostream> 
using namespace std;

int main()
{

char string[] = R"(你好)"R"(=hello)";
char u8u8string[] = u8R"(你好)"u8R"(=hello)";
//char u8ustring[] = u8R"(你好)"uR"=hello"; //编译报错
cout << string<< endl;
cout << u8string << endl;
cout << sizeof(string) << endl;
cout << sizeof(u8u8string) << endl;
return 0;
}
//程序编译选项:g++ -finput-charset=utf-8 test.cpp

代码输出结果如下:

你好=hello
你好=hello
13
13

可以看出,原生字符串会被编译器自动连接在一起,整个字符串“你好=hello”含有两个UTF-8编码的中文字符,共占6字节,和6个ASCII字符,再加上自动生成的空字符\0,字符串共占用13字节空间。UTF-8与UTF-16两种不同编码的字符在连接时,编译报错,C++目前还不支持这种写法,请避免。

以上就是解读C++11 原生字符串的详细内容,更多关于C++11 原生字符串的资料请关注脚本之家其它相关文章!

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多