C++之string
C++中的string类型,相对于char*类型,有内存空间不受限、字符串长度不受限等优势。
注意,string不算一个基础类型,要注意它有构造函数、析构函数。
一、string的库函数
1. string 可用的初始化方法(构造函数)如下:
string s; // 若定义时未初始化,则该变量将被初始化为空字符串 "" string s(string str [, size_t index[, size_t len] ]); // 用str 【从index位开始【,长为len】】的部分进行初始化;其中 index和len是部分可选的 string s(char* cstr [, size_t n]); // 从字符串cstr【的前n个字符进】行初始化,n为可选的 string s(size_t n, char ch); // 用n个ch字符进行初始化 s.~string() //销毁所有字符,释放内存
2. string类型的size()和length()函数功能是一样的,length()是延续C风格的函数。
string a = "xxyy"; // string类型的字符以 '\0' 结尾 // a.size() == 4 // size()函数获得的长度不包含 '\0' // a[a.size()] == "\0"// 可以取到 '\0',该等式为true
max_size() 为stl能允许的最大size(一般是无限大),capacity()则是在realloc之前的大小。
3. 迭代器
有 begin(),rbegin(),cbegin(),crbegin()四个系列,后面两种是const_iterator。const_iterator可以进行遍历,但不能用这类迭代器修改它指向的内容。
4. append(),push_back(),insert(),replace()
append的参数和string的构造函数的参数类型是一致的,有多种方式。
push_back(char ch);
insert在指定位置插入一些东西,内容和构造函数的参数内容差不多,参考文档。replace的参数也类似,参考文档
erase的可选参数列表如下
string& erase (size_t pos = 0, size_t len = npos); iterator erase (const_iterator p); iterator erase (const_iterator first, const_iterator last);
5. find(str [, pos]):找到第一个和str完全匹配的的位置,
find_first_of(str [, pos]):找到第一个和str中任意一个字符匹配的位置
find_first_not_of(str [, pos]):找到第一个和str中任意一个字符都不匹配的位置
二、相关使用
1. 用printf输出字符串
printf("%s",str.c_str()); // 调用c_str()函数,%s接收的参数为char* 类型的,作转换的话会输出乱码
c_str()函数原型为 const char* c_str(),返回的是一个临时指针,在调用 c_str() 的语句结束后,该指针就会被回收,所以用 strcpy() 函数保存这个临时指针指向的内容,这样才能复用。
string s = "xxx"; char* c = s.c_str(); // c承接的是临时指针,有效性只在这一句;得到以 \0 结尾的字符数组 cout << c << endl; // c保存的地址还在,但是该地址指向的内容已经被析构了,即 c变成了空指针;无论输出是否正常(有可能正常,看编译器怎么处理),c实际上都不是指向要赋给它的对象 // 用法 cout << s.c_str() << endl; // 1. 直接用 char dst[] = "aaaa"; #include <cstring> strcpy(dst, s.c_str()); // 2. 用字符数组保存
* strcpy包含在头文件 cstring 中
其中dest应当是字符数组,并且该数组应当足够长,用于存放原字符串;返回的char* 指针和原dest指针都指向目标字符串dest。
char *strcpy(char *dest, const char *src)