引言
字符串是笔试中常考的题型, C++ 提供了以下两种类型的字符串表示形式:
- C 风格字符串char*
- C++ 引入的 string 类类型
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};//形式1
char greeting[] = "Hello"; //形式2
C++中有大量的的函数用来操作以 null 结尾的字符串:
num | function | objective |
1 | strcpy(s1, s2); | 复制字符串 s2 到字符串 s1。 |
2 | strcat(s1, s2); | 连接字符串 s2 到字符串 s1 的末尾。 |
3 | strlen(s1); | 返回字符串 s1 的长度。 |
4 | strcmp(s1, s2); | 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。 |
5 | strchr(s1, ch); | 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
6 | strstr(s1, s2); | 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
后来,ISO/ANSI C++98标准通过添加string类扩展了C++库。
string类类型是C++中提供的一个内建数据类型,按照类的方式进行动态管理字符串,可替代C语言中char数组。string和 vector、list一样是C++标准库的一个重要的部分,底层是一种顺序表的结构,元素是char类型的字符,是 STL 中 basic_string 模板实例化得到的模板类,其定义如下:
typedef basic_string <char> string;
之所以抛弃C 风格字符串char*而引入 string 类类型,是因为与前者相比:
(1)不必担心内存是否足够、字符串长度;
(2)作为一个泛型类出现,集成了许多操作函数满足大多数需要,如:重载了一些操作符,可用“ =“ 进行赋值操作,用“==“、 ">"、 “<”、 “>=”、“<=” 进行比较,用“+“ 、 “+=”做串联;封装了了一些成员函数,可以方便的完成替换、插入、删除,比较、提取、复制、交换操作。
(3)作为STL中的一种数据结构,得到STL中算法的支持;
(4)可以很好的与cin、cout、fstream、sstream等类型兼容。
总的来讲,使用起来要比C 风格字符串char*方便许多。
string的使用
1. 导入string类型
要使用string类,(1)必须在程序中包含头文件string;(2)string类位于名称空间std中,因此您必须提供一条using编译指令,或者使用std::string来引用它。
#include<string> //导入头文件
using namespace std; //引入命名空间方法1
using std::string; //引入命名空间方法2
2. string初始化(实例化)
string str; //默认构造,把str初始化为一个空字符串
string str(int num,char c);//普通构造,生成一个字符串,包含num个c字符
string str(string str_other); //拷贝构造,将字符串str_other当做str的初值
string str=str_other;//拷贝构造,将字符串str_other当做str的初值
string str="xxxxx";//拷贝构造,将字符串字面量当做str的初值
string str(string str_other,int stridx); //拷贝构造,将字符串str_other[stridx...end]当作字符串str的初值
string str(string str,int stridx,int strlen); //拷贝构造,将字符串
str_other[stridx...stridx+strlen-1] 当作字符串str的初值
string str(char* cstr);//拷贝构造,将c风格字符串cstr作为str的初值
string str(char* cstr,int len); //拷贝构造,将c字符串cstr前len个字符作为字符串str的初值
string str(str_other.begin(),str_other.end()) //拷贝构造,以区间beg;end(不包含end)内的字符作为字符串s的初值
s.~string(); //销毁所有字符,释放内存
3. string类型的内置函数
string 函数列表
函数名 | 描述 |
iterator begin(); | 得到指向字符串开头的Iterator |
iterator end(); | 得到指向字符串结尾的Iterator |
const reverse_iterator rbegin(); | 得到指向反向字符串开头的Iterator |
const reverse_iterator rend(); | 得到指向反向字符串结尾的Iterator |
size_t size(); | 得到字符串的大小 |
size_t length(); | 和size函数功能相同 |
size_t max_size(); | 字符串可能的最大大小 |
size_t capacity(); | 在不重新分配内存的情况下,字符串可能的大小 |
bool empty(); | 判断是否为空 |
char& operator[] (size_t pos);//可为左值 const char& operator[] (size_t pos) const;//不懂为何这样重载 | 取第几个元素,相当于数组 |
const char* c_str() const; eg: std::string str ("Please split this sentence into tokens"); char * cstr = new char [str.length()+1]; std::strcpy (cstr, str.c_str()); | 取得C风格的const char* 字符串 |
data | 取得字符串内容地址 |
string& operator= | 赋值操作符 |
reserve | 预留空间 |
void swap | 交换函数 |
string& insert | 插入字符 |
string& append | 追加字符 |
string& push_back | 追加字符 |
string& operator+= | += 操作符 |
string& erase | 删除字符串 |
clear | 清空字符容器中所有内容 |
resize | 重新分配空间 |
string& assign | 和赋值操作符一样 |
string& replace | 替代 |
copy | 字符串到空间 |
int find | 查找 |
int rfind | 反向查找 |
int find_first_of | 查找包含子串中的任何字符,返回第一个位置 |
int find_first_not_of | 查找不包含子串中的任何字符,返回第一个位置 |
int find_last_of | 查找包含子串中的任何字符,返回最后一个位置 |
find_last_not_of | 查找不包含子串中的任何字符,返回最后一个位置 |
string substr | 得到字串 |
compare | 比较字符串 |
operator+ | 字符串链接 |
bool operator== | 判断是否相等 |
bool operator!= | 判断是否不等于 |
bool operator< | 判断是否小于 |
bool operator<= | 判断是否小于等于 |
bool operator> | 判断是否大于 |
bool operator>= | 判断是否大于等于 |
istream operator>> | 从输入流中读入字符串 |
ostream operator<< | 字符串写入输出流 |
getline | 从输入流中读入一行 |
参 考:
C++ 字符串 | 菜鸟教程 (C++ 字符串)
33-C++基础string类介绍_青木年华-CSDN博客.html (33-C++基础string类介绍)
C++中string详解_sunprice的博客-CSDN博客_string在c++是什么意思.html (C++中string详解)
STL 源码分析之string(一)基础篇_jmhIcoding-CSDN博客_stl string源码.html (STL 源码分析之string(一)基础篇)
c++中string类的源代码_随意的风的专栏-CSDN博客 (c++中string类的源代码)
http://www.cplusplus.com/reference/string/string (C++ Reference:string)