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)

 

posted @ 2022-09-15 15:26  谷小雨  阅读(112)  评论(0编辑  收藏  举报