解读C++11 原生字符串

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 原生字符串的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++如何过滤出字符串的中文(GBK、UTF-8)

    前言 最近在处理游戏敏感词之类的东西,为了加强屏蔽处理,所以需要过滤掉字符串中的除汉字之外的是其他东西如数字,符号,英文字母等. 首先我查阅资料并写了个函数: 示例:返回输入字符串中汉字的个数: std::string StrWithOutSymbol(const std::string &source) { string sourceWithOutSymbol; int i = 0; while (source[i] != 0) { if (source[i] & 0x80 ) { so

  • C++中的string类(C++字符串)入门完全攻略

    前言 string 类是 STL 中 basic_string 模板实例化得到的模板类.其定义如下: typedef basic_string <char> string; basic_string 此处可以不必深究. string 类的成员函数有很多,同一个名字的函数也常会有五六个重载的版本.篇幅所限,不能将这些原型一一列出并加以解释.这里仅对常用成员函数按功能进行分类,并直接给出应用的例子,通过例子,读者可以基本掌握这些成员函数的用法. 要想更深入地了解 string 类,还要阅读 C++

  • 详解C++ string常用截取字符串方法

    string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置.找到返回子字符串首次出现的位置,否则返回-1: 注: (1)find_last_of的npos为从末尾开始寻找的位置. (2)下文中用到的strsub(npos,size)函数,其中npos为开始位置,size为截取大小 例1:直接查

  • C++ 整型与字符串的互转方式

    flyfish 字符串转整型 C的方法 cstr是char*或者const char*类型的字符串 int num = atoi(str); int num = strtol(cstr, NULL, 10); //10 表示进制 C++11的方法 void test1() { std::string str1 = "1"; std::string str2 = "1.5"; std::string str3 = "1 with words"; i

  • C++找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)

    已知字符串"aabbbcddddeeffffghijklmnopqrst"编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2) /******************************************************** Copyright (C), 2016-2017, FileName: main9 Author: woniu201 Description:求字符串中出现次数最多的字符和次数 ******************************

  • C++实现字符串删除字符后逆序输出

    本文实例为大家分享了C++实现字符串删除字符后逆序输出的具体代码,供大家参考,具体内容如下 输入若干个字符串,和一个英文字符ch. 要求删除每个字符串中的字符ch(区分大小写),得到新的字符串,然后将新的字符串按照字典逆序排序后输出 (每个字符串的长度不超过30个字符,字符串总数不超过30) 输入: 3 abcddc sxwcdez ncvccvd c 输出: sxwdez nvvd abdd C++实现:(适用于初学者) #include <iostream> #include <cs

  • C++实现十六进制字符串转换成int整形值的示例

    十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制.一般用数字0到9和字母A到F(或a~f)表示,其中:A~F表示10~15,这些称作十六进制数字. 开发中经常需要把16进制字符串转换成整形,写了个个代码供大家参考下: #include <stdio.h> #include <string.h> //字符转换成整形 int hex2int(char c) { if ((c >= 'A') && (c <= 'Z')) { return c

  • c++字符串分割的方法

    C++ 中经常需要对字符串按照分隔符进行分割以获得子串序列,子串的顺序与其在原字符串中出现的顺序一致.一般有两种需求场景:  (1)给定一个分隔符(单个字符或子串)分割字符串:  (2)给定一个或多个分隔符(单个字符),分割字符串. 当给定的分隔符不在原字符串中,则原字符串不被分割,返回单个元素为原字符串的 vector. 注意,本文实现时,如果被分割后的子串为空串,则不计入最终的子串序列.比如原字符串是"a,b",分隔符为",",那么分割后的子串序列为 [&quo

  • c++将字符串转数字的实例方法

    C++字符串转化为数字的库函数 1.atoi 功 能:把一字符串转换为整数 用 法:int atoi(const char *nptr); 详细解释:atoi是英文array to integer 的缩写.atoi()会扫描参数nptr字符串,如果第一个字符不是数字也不是正负号返回零,否则开始做类型转换,之后检测到非数字或结束符 /0 时停止转换,返回整型数. 参 数: *nptr: 待转化的字符串. 返回值: int: 转换后的整形数. 2.atol 功 能:把一字符串转换为长整形 用 法:l

  • C++中string替换所有指定字符串的方法

    C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串全部替换这个功能,string并没有实现,我们今天来做的就是这件事. 首先明白一个概念,即string替换所有字符串,将"12212″这个字符串的所有"12″都替换成"21″,结果是什么? 可以是22211,也可以是21221,有时候应用的场景不同,就会希望得到不同的结果,所以这两种答案都做了实现,代码如下: # include # include using namespace st

随机推荐