目录

  • 1. string容器 简介
  • 2. string类常用的操作函数
  • 3. 构造函数
  • 4. 赋值操作
  • 5. 字符串拼接
  • 6. 字符串查找和替换
  • 7. 字符串比较
  • 8. 字符串存取
  • 9. 字符串插入和删除
  • 10. 子符串获取
  • 11. C字符串与string串
    • 11.1 string转换成const char *
    • 11.2 string转换成char *
    • 11.3 char *转换成string
    • 11.4 char[ ] 转换成string
    • 11.5 string转换成char[ ]
  • 12. append、push_back和+=运算符的区别

1. string容器 简介

(1)string是C++风格的字符串,而string本质上是一个类。
(2)string 和 char* 区别:①char* 是一个指针
                                            ② string 是一个类,类内部封装了 char*,管理这个字符串是一个char型容器。
(3)string特点:①string类内部封装了很多成员方法, 例如,查找find,拷贝copy,删除delete,替换replace,插入insert。
                             ②string管理char* 所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。

2. string类常用的操作函数

1) =,assign()   //赋以新值2) swap()   //交换两个字符串的内容3) +=,append(),push_back() //在尾部添加字符4) insert() //插入字符5) erase() //删除字符6) clear() //删除全部字符7) replace() //替换字符8) + //串联字符串9) ==,!=,<,<=,>,>=,compare()  //比较字符串10)size(),length()  //返回字符数量11) max_size() //返回字符的可能最大个数12) empty()  //判断字符串是否为空13) capacity() //返回重新分配之前的字符容量14) reserve() //保留一定量内存以容纳一定数量的字符15) [ ], at() //存取单一字符16) >>,getline() //从stream读取某值17) <<  //将谋值写入stream18) copy() //将某值赋值为一个C_string19) c_str() //将内容以C_string返回20) data() //将内容以字符数组形式返回21) substr() //返回某个子字符串22) find()查找函数23) begin() end() //提供类似STL的迭代器支持24) rbegin() rend() //逆向迭代器25) get_allocator() //返回配置器

3. 构造函数

(1) string构造函数原型:

1. string();   //  创建一个空的字符串 例如:string str;
2. string(const char * s);    // 使用字符串s初始化
3. string(const string & str);  // 使用一个string对象初始化另一个string对象
4. string(int n,char c);  // 使用n个字符c初始化

(2)string的多种构造方式没有可比性,灵活使用即可。

#include <stdlib.h>
#include <iostream>
#include <string> using namespace std;//string的构造函数/**1. string();   //  创建一个空的字符串 例如:string str;*2. string(const char* s);    // 使用字符串str初始化*3. string(const string & str);  // 使用一个string对象初始化另一个string对象*4. string(int n, char c);  //使用n个字符c初始化*/
void test01()
{string s1;  //默认构造就是空字符串cout << "s1 = " << s1 << endl;const char* str = "hello world";   //使用字符串str初始化string s2(str);cout << "s2 = " << s2 << endl;string s3(s2);cout << "s3 = " << s3 << endl;string s4(10, 'a');cout << "s4 = " << s4 << endl;}int main()
{test01();//system("pause");//只适合DOS或者windows,不适合Linux//在一个程序中写有  system("pause")语句时,就是说从该程序里调用了“pause”命令,//即让操作系统来暂停该程序进程的执行,同时程序运行到此语句处时,会在程序的窗口上显示“Press any key to continue . . .” 也就是 “按任意键继续...”,//即等待用户按下任意一个按键使该程序从暂停状态返回到执行状态继续从刚才暂停的地方开始执行。return 0;
}

运行结果:

4. 赋值操作

(1)给string字符串进行赋值。
(2)赋值的函数原型:

1. string& operator=(const char* s);  //char * 类型字符串赋值给当前的字符串
2. string& operator=(const strinng &s); //把字符串s赋给当前的字符串
3. string& operator=(char c); //字符赋值给当前的字符串
4. string& assign(const char *s); //把字符串s赋给当前的字符串
5. string& assign(const char *s,int n); //把字符串s的前n个字符赋给当前的字符串
6. string& assign(const string &s); //把字符串s赋给当前字符串
7. string& assign(int n, char c); //用n个字符c赋给当前字符串

(3)string的赋值方式很多,operator=这种方式是比较常用的。

#include <iostream>
#include<string> using namespace std;//string赋值操作/*1. string& operator=(const char* s);  //char * 类型字符串赋值给当前的字符串2. string& operator=(const string &s); //把字符串s赋给当前的字符串3. string& operator=(char c); //字符赋值给当前的字符串4. string& assign(const char *s); //把字符串s赋给当前的字符串5. string& assign(const char *s,int n); //把字符串s的前n个字符赋给当前的字符串6. string& assign(const string &s); //把字符串s赋给当前字符串7. string& assign(int n, char c); //用n个字符c赋给当前字符串*/void test02()
{string str1;str1 = "hello world";  //第一种等号方式cout << "str1 = " << str1 << endl;string str2;str2 = str1;   //第二种等号方式cout << "str2 = " << str2 << endl;string str3;str3 = 'a';    //第三种等号方式cout << "str3 = " << str3 << endl;string str4;str4.assign("hello C++");   //第一种assign方式cout << "str4 = " << str4 << endl;string str5;str5.assign("hello C++",5);   //第二种assign方式,取字符串"hello C++"中的前五个字符赋值给str5cout << "str5 = " << str5 << endl;string str6;str6.assign(str5);   //第三种assign方式cout << "str6 = " << str6 << endl;string str7;str7.assign(10,'w');   //第四种assign方式cout << "str7 = " << str7 << endl;}int main()
{test02();return 0;
}

运行结果:

5. 字符串拼接

(1) 实现在字符串末尾拼接字符串。
(2)函数原型:

1. string& operator+=(const char* str);  //重载+=操作符
2. 2. string& operator+=(const char c); //重载+=操作符
3. string& operator+=(const string& str); //重载+=操作符
4. string& append+=(const char* s); //把字符串s连接到当前字符串结尾
5. string& append+=(const char* s, int n); //把字符串s的前n个字符连接到当前字符串结尾
6. string& append+=(const string &s); //同operator+=(const string& str)
7. string& append+=(const char &s, int pos, int n); //字符串s从pos开始的n个字符连接到字符串结尾
#include <iostream>
#include<string> using namespace std;//string赋值操作/*1. string& operator+=(const char* str);  //重载+=操作符2. string& operator+=(const char c); //重载+=操作符3. string& operator+=(const string& str); //重载+=操作符4. string& append+=(const char* s); //把字符串s连接到当前字符串结尾5. string& append+=(const char* s, int n); //把字符串s的前n个字符连接到当前字符串结尾6. string& append+=(const string &s); //同operator+=(const string& str)7. string& append+=(const char &s, int pos, int n); //字符串s从pos开始的n个字符连接到字符串结尾*/void test03()
{string str1 = "我";  //字符串初始化str1 += "爱玩游戏";cout << "str1 = " << str1 << endl;str1 += ':';   //追加一个字符cout << "str1 = " << str1 << endl;string str2 = " LOL";str1 += str2;    //追加字符串cout << "str1 = " << str1 << endl;string str3 = "I";str3.append(" love ");cout << "str3 = " << str3 << endl;str3.append("game abcde ",4);  //只把字符串的前4个拼接过去cout << "str3 = " << str3 << endl;str3.append(str2);  cout << "str3 = " << str3 << endl;str3.append(str2,0,4);  //只截取到LoL,参数2表示从哪个位置开始截取,参数3表示截取字符个数cout << "str3 = " << str3 << endl;
}int main()
{test03();return 0;
}

运行结果:

6. 字符串查找和替换

(1)查找:查找指定字符串是否存在。
(2)替换:在指定的位置替换字符串。
(3)函数原型:

1. int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
2.  int find(const char* s, int pos = 0) const;  // 查找s第一次出现位置,从pos开始查找
3. int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
4. int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
5.  int rfind(const string& str, int pos = npos) const;  //查找str最后一次位置,从pos开始查找
6.  int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
7. int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
8.  int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
9.  string& replace(int pos, int n, const string& str) const; //替换从pos开始n个字符为字符串str
10.  string& replace(int pos, int n, const string* s) const; //替换从pos开始的n个字符为s

(4) find查找是从左往右,rfind从右往左。
(5) find找到字符串后返回查找的第一个字符位置,找不到返回-1。
(6) replace在替换时,要知道从哪个位置起,多少个字符,替换成什么样的字符串。

#include <iostream>
#include<string> using namespace std;//string查找和替换/*
//查找str第一次出现位置,从pos开始查找
1. int find(const string& str, int pos = 0) const;
// 查找s第一次出现位置,从pos开始查找
2. int find(const char* s, int pos = 0) const;
//从pos位置查找s的前n个字符第一次位置
3. int find(const char* s, int pos, int n) const;
//查找字符c第一次出现位置
4. int find(const char c, int pos = 0) const;
//查找str最后一次位置,从pos开始查找
5. int rfind(const string& str, int pos = npos) const;
//查找s最后一次出现位置,从pos开始查找
6. int rfind(const char* s, int pos = npos) const;
//从pos查找s的前n个字符最后一次位置
7. int rfind(const char* s, int pos, int n) const;
//查找字符c最后一次出现位置
8. int rfind(const char c, int pos = 0) const;
//替换从pos开始n个字符为字符串str
9. string& replace(int pos, int n, const string& str) const;
//替换从pos开始的n个字符为s
10. string& replace(int pos, int n, const string* s) const;
*///1、查找
void test04()
{string str1 = "abcdefgde"; int pos = str1.find("de");  //从零开始索引,返回值为d出现的位置"3",若找不到子字符串,就返回-1if (pos == -1){cout << "未找到字符串 pos = " << pos << endl;}else{cout << " pos = " << pos << endl;}//rfindpos = str1.rfind("de");  //rfind是从右往左查找,find是从左往右查找cout << " pos = " << pos << endl;//rfindstring str = "123456123456123456";pos = str.rfind("123"); //从后往前找,下标一直是从昨往右数的cout << " pos = " << pos << endl;;
}void test05()
{string str1 = "abcdefg";str1.replace(1, 3, "1111");  // 从 "1" 号位置起,"1111"有四个字符,所以变为4个字符替换成 "1111",而不是出现3个字符替换成"111"cout << " str1 = " << str1 << endl;
}int main()
{test04();test05();return 0;
}

运行结果:

7. 字符串比较

(1)功能描述:字符串之间比较。
(2)比较方式:字符串比较是按字符的ASCII码进行对比。

1.  = 返回 0
2.  > 返回 1
3.  < 返回 -1

(3) 函数原型:

1. int compare(const string & s) const; //与字符串s比较
2. int compare(const char * s) const;  //与字符串s比较
#include <iostream>
#include<string> using namespace std;//字符串比较void test06()
{string str1 = "hello";string str2 = "hello";//compar常用于比较两个字符串相等或不相等,判断谁大谁小的意义并不是很大if (str1.compare(str2) == 0){cout << "str1 等于 str2" << endl;}else if (str1.compare(str2) > 0){cout << "str1 大于 str2" << endl;}else{cout << "str1 小于 str2" << endl;}string str3 = "hello world";string str4 = "hello c++";if (str3.compare(str4) == 0){cout << "str3 等于 str4" << endl;}else if (str3.compare(str4) > 0){cout << "str3 大于 str4" << endl;}else{cout << "str3 小于 str4" << endl;}
}int main()
{test06();return 0;
}

运行结果:

8. 字符串存取

(1) string中单个字符存取方式有两种:

1. char& operator[](int n); //通过[]方式取字符
2. char& at(int n); //通过at方式取字符
#include <iostream>
#include<string> using namespace std;//string 字符存取void test07()
{string str = "hello";cout << "str= " << str << endl;//1、通过[]访问单个字符for (int i = 0; i < str.size(); i++){cout << str[i] << " "; }cout << endl; //换行符//2、通过at方式访问单个字符for (int i = 0; i < str.size(); i++){cout << str.at(i) << " ";}cout << endl;//修改单个字符str[0] = 'x';cout << "str= " << str << endl;str.at(1) = 'x';cout << "str= " << str << endl;
}int main()
{test07();return 0;
}

运行结果:

9. 字符串插入和删除

(1)功能描述:对string字符串进行插入和删除字符操作。
(2) 函数原型:

1. string& insert(int pos, const char * s);  // 插入字符串
2. string& insert(int pos, const string& str); //插入字符串
3. string& insert(int pos, int n, char c);  //在指定位置插入n个字符c
4. string& erase(int pos, int n = npos);   //删除从Pos开始的n个字符

(3)插入和删除的起始下标都是从0开始。

#include <iostream>
#include<string>
using namespace std;//字符串 插入和删除void test08()
{string str = "hello";//插入str.insert(1, "111");//hellocout << "str = " << str << endl;//删除str.erase(1, 3); //从第“1”个位置起,删3个cout << "str = " << str << endl;
}int main()
{test08();return 0;
}

运行结果:

10. 子符串获取

(1)功能描述:从字符串中获取想要的子串。
(2) 函数原型:

1. string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字组成的字符串。

(3)灵活的运用求子串功能,可以在实际开发中获取有效的信息。

#include <iostream>
#include<string> using namespace std;//string 求子串void test09()
{string str = "abcdef";string subStr = str.substr(1, 3); cout << "subStr = " << subStr << endl;
}//实用操作
void test10()
{string email = "zhangsan@sina.com";//从邮件地址中 获取 用户名称int pos = email.find("@");cout << pos << endl;string usrName = email.substr(0, pos);cout << usrName << endl;
}int main()
{test09();test10();return 0;
}

运行结果:

11. C字符串与string串

string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。
注意,与char不同的是,string不一定以NULL(‘\0’)结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char

11.1 string转换成const char *

如果要将字面值string直接转换成const char*类型。string有2个函数可以运用:一个是.c_str(),一个是data成员函数。
c_str()函数返回一个指向正规C字符串的指针,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成C中的字符串样式。
注意:一定要使用strcpy()函数等来操作方法c_str()返回的指针

string str = "Hello World";
const char *ch1 = str.c_str();
const char *ch2 = str.data();

此时,ch1与ch2的内容将都是”Hello World”。但是只能转换成const char*,如果去掉const编译不能通过。

11.2 string转换成char *

C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中
(1) data()以字符数组的形式返回字符串内容,但并不添加’\0’。
(2)c_str()返回一个以’\0’结尾的字符数组,返回值是const char*。
(3)copy()则把字符串的内容复制或写入既有的c_string或字符数组内。
C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。
如果要转换成char*,可以用string的一个成员函数strcpy实现。

string str = "Hello World";
int len = str.length();
char *data = new char[len+1];  //这里+1还是不+1需要注意
strcpy(data, str.c_str());  // const char *data = new char[len+1];  strcpy(data, str);

此时,data中的内容为”Hello World”使用c_str()要么str赋给一个const指针,要么用strcpy()复制。

11.3 char *转换成string

string类型能够自动将C风格的字符串转换成string对象

string str;
const char *pc = "Hello World";
str = pc;
printf(“%s\n”, str);  //此处出现错误的输出
cout<<str<<endl;

不过这个是会出现问题的。有一种情况我要说明一下。当我们定义了一个string类型之后,用printf(“%s”,str);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。
用cout输出是没有问题的,若一定要printf输出。那么可以这样:

printf("%s",str.c_str());

11.4 char[ ] 转换成string

这个与char*的情况相同,也可以直接赋值,但是也会出现上面的问题,需要同样的处理。
字符数组转化成string类型:

char ch [] = "ABCDEFG";
string str(ch); //也可string str = ch;

或者

char ch [] = "ABCDEFG";
string str;
str = ch; //在原有基础上添加可以用str += ch;

11.5 string转换成char[ ]

string对象转换成C风格的字符串:

const char *str = s.c_str();

这是因为为了防止字符数组被程序直接处理c_str()返回了一个指向常量数组的指针。
由于我们知道string的长度可以根据length()函数得到,又可以根据下标直接访问,所以用一个循环就可以赋值了,这样的转换不可以直接赋值。

string str = "Hello World";
int len=str.length();
char ch[255]={};
for( int i=0;i<str.length();i++)
ch[i] = str[i];
ch[len+1] = '\0';
printf("%s\n", ch);
cout<<ch<<endl;

12. append、push_back和+=运算符的区别

+= 运算符:允许追加字符串和单个字符。
append 函数:允许追加字符串,不允许追加单个字符。
push_back 函数:只能追加单个字符。

【STL】string详解(string类常用的操作函数、构造函数、赋值操作、子符串的拼接、查找和替换、比较、存取、插入和删除、获取)相关推荐

  1. STL 容器详解——string 类

    目录 传统艺能

  2. C++中string详解与用法

    string详解 string不是基本数据类型,是C++中对char封装成的类,所以C语言中没有string. String类是不可变的,对String类的任何改变,都是返回一个新的String类对象 ...

  3. String详解(intern、StringBuffer、StringBuilder)

    "+"操作符,它执行的加入对原始类型(如int和double),重载对String对象进行操作.'+'两个字符串操作数进行串联. java不考虑让开发者支持运算符重载.在支持运算符 ...

  4. java源码详解——String类

    java源码详解--String类目录: Java String 类 下面开始介绍主要方法: Java charAt() 方法 Java compareTo() 方法 int compareTo(St ...

  5. C++ string详解

    C++ string详解 -------------------------------------------------------------------------------- 来源:CSD ...

  6. C++string详解

    之所以抛弃char*的字符串而选用 C++ 标准程序库中的 string 类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下 ...

  7. (49)System Verilog字符串string详解

    (49)System Verilog字符串string详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog字符串string详解 5) ...

  8. c语言标准库详解(七):字符串函数string.h

    c语言标准库详解(七):字符串函数<string.h> 头文件<string.h>中定义了两组字符串函数.第一组函数的名字以 str 开头:第二组函数的名字以 mem 开头.除 ...

  9. 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen

    类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n    // 类定义\n};\n\ntemplate\u003Ctypenam ...

最新文章

  1. UIButton状态探索和自定义
  2. 皮一皮:这才是书法的最高境界...
  3. sphinx源码分析总结
  4. Java程序员从笨鸟到菜鸟之(七十二)细谈Spring(四)利用注解实现spring基本配置详解
  5. ABAP Submit 用法解析
  6. 深度运用LSTM神经网络并与经典时序模型对比
  7. qtabwidget的图标_实战PyQt5: 050-选项卡控件QTabWidget
  8. python用for循环读取图片_python 使用for循环简单爬取图片(1)
  9. typescript接口定义
  10. VMware 即使克隆解析
  11. 求1--100的和 Python3实现
  12. 定位CoreLocation 使用
  13. 云服务器能否部署聊天系统,实现外网通讯?
  14. centos 5.6 x86 安装 文泉驿字体
  15. Java设计模式学习记录-模板方法模式
  16. vs2010 solidworks2015 c# add-in模板 二次开发
  17. 通过Python实现物联网金橙子自动打标
  18. Androidstudio 连接夜神模拟器
  19. 录屏工具ScreenToGif功能总结
  20. C语言函数中的3个点 ...有什么作用

热门文章

  1. 数据库系统—实体联系模型
  2. 视觉中国的NoSQL之路:从MySQL到MongoDB
  3. linux遇到nul字符,linux TXT文件操作 '^@ ' 'NUL' 符号乱码问题
  4. 扩展欧几里得定理求ax + by = c 的通解
  5. Excel 2003 VBA编程参考
  6. mySql 修改字段属性
  7. proftpd的SSH_DISCONNECT (Read TImed out,Key exchange failed.错误解决
  8. 华为机试—手机号码验证
  9. python提取excel内容
  10. 2022杭电多校8 Stormwind