原:https://blog.csdn.net/qq_37941471/article/details/82107077

一. string的构造函数的形式:

string str:生成空字符串

string s(str):生成字符串为str的复制品

string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值

string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值

string s(num ,c):生成num个c字符的字符串

string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值

eg:

string str1;               //生成空字符串

string str2("123456789");  //生成"1234456789"的复制品

string str3("12345", 0, 3);//结果为"123"

string str4("012345", 5);  //结果为"01234"

string str5(5, '1');       //结果为"11111"

 string str6(str2, 2);      //结果为"3456789"

二. string的大小和容量:

1. size()和length():返回string对象的字符个数,他们执行效果相同。

2. max_size():返回string对象最多包含的字符数,超出会抛出length_error异常

3. capacity():重新分配内存之前,string对象能包含的最大字符数

三. string的字符串比较:

1. C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与c-string的比较(如 str<”hello”)。 在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小, 比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小(前面减后面)同时,string (“aaaa”) <string(aaaaa)。

2. 另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0:相等 1:大于 -1:小于 (A的ASCII码是65,a的ASCII码是97)

四. string的插入:push_back() 和 insert()

 void  test4(){

     string s1;

     // 尾插一个字符

     s1.push_back('a');

     s1.push_back('b');

     s1.push_back('c');

     cout<<"s1:"<<s1<<endl; // s1:abc

     // insert(pos,char):在制定的位置pos前插入字符char

     s1.insert(s1.begin(),'');

     cout<<"s1:"<<s1<<endl; // s1:1abc

 }

五、string拼接字符串:append() & + 操作符

 void test5(){

     // 方法一:append()

     string s1("abc");

     s1.append("def");

     cout<<"s1:"<<s1<<endl; // s1:abcdef

     // 方法二:+ 操作符

     string s2 = "abc";

     /*s2 += "def";*/

     string s3 = "def";

     s2 += s3.c_str();

     cout<<"s2:"<<s2<<endl; // s2:abcdef

 }

六、 string的遍历:借助迭代器 或者 下标法

 void test6(){

     string s1("abcdef"); // 调用一次构造函数

     // 方法一:下标法

     for( int i = ; i < s1.size() ; i++ ){

         cout<<s1[i];

     }

     cout<<endl;

     // 方法二:正向迭代器

     string::iterator iter = s1.begin();

     for( ; iter < s1.end() ; iter++){

         cout<<*iter;

     }

     cout<<endl;

     // 方法三:反向迭代器

     string::reverse_iterator riter = s1.rbegin();

     for( ; riter < s1.rend() ; riter++){

         cout<<*riter;

     }

     cout<<endl;

 }

七、 string的删除:erase()

1. iterator erase(iterator p);//删除字符串中p所指的字符

2. iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符

3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引位置pos开始的len个字符

4. void clear();//删除字符串中所有字符

 void test6(){

     string s1 = "";

     // s1.erase(s1.begin()+1);              // 结果:13456789

     // s1.erase(s1.begin()+1,s1.end()-2);   // 结果:189

     s1.erase(,);                       // 结果:189

     string::iterator iter = s1.begin();

     while( iter != s1.end() ){

         cout<<*iter;

         *iter++;

     }

     cout<<endl;

 }

八、 string的字符替换:

1. string& replace(size_t pos, size_t n, const char *s);//将当前字符串从pos索引开始的n个字符,替换成字符串s

2. string& replace(size_t pos, size_t n, size_t n1, char c); //将当前字符串从pos索引开始的n个字符,替换成n1个字符c

3. string& replace(iterator i1, iterator i2, const char* s);//将当前字符串[i1,i2)区间中的字符串替换为字符串s

 void test7(){

     string s1("hello,world!");

     cout<<s1.size()<<endl;                     // 结果:12

     s1.replace(s1.size()-,,,'.');           // 结果:hello,world.

     // 这里的6表示下标  5表示长度

     s1.replace(,,"girl");                    // 结果:hello,girl.

     // s1.begin(),s1.begin()+5 是左闭右开区间

     s1.replace(s1.begin(),s1.begin()+,"boy"); // 结果:boy,girl.

     cout<<s1<<endl;

 }

九、 string的大小写转换:tolower()和toupper()函数 或者 STL中的transform算法

方法一:使用C语言之前的方法,使用函数,进行转换

 #include <iostream>

 #include <string>

 using namespace std;

 int main(){

     string s = "ABCDEFG";

     for( int i = ; i < s.size(); i++ ){

         s[i] = tolower(s[i]);

     }

     cout<<s<<endl;

     return ;

 }

方法二:通过STL的transform算法配合的toupper和tolower来实现该功能

 #include <iostream>
#include <algorithm>
#include <string>
using namespace std; int main(){ string s = "ABCDEFG";
   string result; transform(s.begin(),s.end(),s.begin(),::tolower); cout<<s<<endl; return ; }

十、 string的查找:find

1. size_t find (constchar* s, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找子串s,返回找到的位置索引,

-1表示查找不到子串

2. size_t find (charc, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找字符c,返回找到的位置索引,

-1表示查找不到字符

3. size_t rfind (constchar* s, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,

-1表示查找不到子串

4. size_t rfind (charc, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符

5. size_tfind_first_of (const char* s, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找子串s的字符,返回找到的位置索引,-1表示查找不到字符

6. size_tfind_first_not_of (const char* s, size_t pos = 0) const;

//在当前字符串的pos索引位置开始,查找第一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

7. size_t find_last_of(const char* s, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,查找最后一个位于子串s的字符,返回找到的位置索引,-1表示查找不到字符

8. size_tfind_last_not_of (const char* s, size_t pos = npos) const;

//在当前字符串的pos索引位置开始,查找最后一个不位于子串s的字符,返回找到的位置索引,-1表示查找不到子串

void test8()

{

string s("dog bird chicken bird cat");

//字符串查找-----找到后返回首字母在字符串中的下标

// 1. 查找一个字符串

cout << s.find("chicken") << endl;        // 结果是:9

// 2. 从下标为6开始找字符'i',返回找到的第一个i的下标

cout << s.find('i',6) << endl;            // 结果是:11

// 3. 从字符串的末尾开始查找字符串,返回的还是首字母在字符串中的下标

cout << s.rfind("chicken") << endl;       // 结果是:9

// 4. 从字符串的末尾开始查找字符

cout << s.rfind('i') << endl;             // 结果是:18-------因为是从末尾开始查找,所以返回第一次找到的字符

// 5. 在该字符串中查找第一个属于字符串s的字符

cout << s.find_first_of("13br98") << endl;  // 结果是:4---b

// 6. 在该字符串中查找第一个不属于字符串s的字符------先匹配dog,然后bird匹配不到,所以打印4

cout << s.find_first_not_of("hello dog 2006") << endl; // 结果是:4

cout << s.find_first_not_of("dog bird 2006") << endl;  // 结果是:9

// 7. 在该字符串最后中查找第一个属于字符串s的字符

cout << s.find_last_of("13r98") << endl;               // 结果是:19

// 8. 在该字符串最后中查找第一个不属于字符串s的字符------先匹配t--a---c,然后空格匹配不到,所以打印21

cout << s.find_last_not_of("teac") << endl;            // 结果是:21

}

十一、 string的排序:sort(s.begin(),s.end())

 #include <iostream>

 #include <algorithm>

 #include <string>

 using namespace std;

 void test9()

 {

     string s = "cdefba";

     sort(s.begin(),s.end());

     cout<<"s:"<<s<<endl;     // 结果:abcdef

 }

十二、 string的分割/截取字符串:strtok() & substr()

 strtok():分割字符串

 void test10(){

     char str[] = "I,am,a,student; hello world!";

     const char *split = ",; !";

     char *p2 = strtok(str,split);

     while( p2 != NULL ){

         cout<<p2<<endl;

         p2 = strtok(NULL,split);

     }

 }

 void test11(){

     string s1("");

     string s2 = s1.substr(,); // 结果:23456-----参数5表示:截取的字符串的长度

     cout<<s2<<endl;

 }

string的学习的更多相关文章

  1. C#文本处理(String)学习笔记

    摘要:string是编程中使用最频繁的类型.一个string表示一个恒定不变的字符序列集合.string类型直接继承自object,故他是一个引用类型,也就是说线程的堆栈上不会有任何字符串(直接继承自 ...

  2. Python 3之str类型、string模块学习笔记

    Windows 10家庭中文版,Python 3.6.4, Python 3.7官文: Text Sequence Type — str string — Common string operatio ...

  3. 标准类型String(学习中)

    1.读取string对象 #include<iostream> #include<cstring> using namespace std; int main() { stri ...

  4. java中String类学习

    java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度. (3)charAT:字符操作,按照索引值获得字符串中的指定字符 ...

  5. String详细学习

    学这些东西,就像是扎马步.小说里郭靖学不会招数,就会扎马步.搞JS,内力还是必须要深厚,深厚,深厚. 1,stringObject.slice(start,end) slice() 方法可提取字符串的 ...

  6. java中String类学习笔记

    1.String的两种实例化方式 String str="hello";//直接赋值的方式: String str=new String("hello");// ...

  7. 关于String类学习的一些笔记(本文参考来自程序员考拉的文章)

    String 类继承自 Object 超类,实现的接口有:Serializable.CharSequence.Comparable<String> 接口,具体如下图: 一.常用的Strin ...

  8. 《C++ Primer Plus》16.1 string类 学习笔记

    16.1.1 构造字符串程序清单16.1使用了string的7个构造函数.程序清单16.1 str1.cpp---------------------------------------------- ...

  9. C++ string类学习总结

    C++字符串技术 string类  string对象在大多数应用中被用来消除对char*指针的使用,支持所期望的一些操作; 可以转换成char*,保持和现代代码的兼容性,还能自动处理内存管理; 一些s ...

随机推荐

  1. 系统学习 Java IO (十)----回退流 PushbackInputStream

    目录:系统学习 Java IO---- 目录,概览 PushbackInputStream 旨在从 InputStream 解析数据时使用. 有时您需要先读取几个字节以查看将要发生的事情,然后才能确定 ...

  2. CSS3 入门级

    从刚开始学习的选择器总共有十三种: id class 标签 子代 后代 交集 并集 通配符 伪类 结构 属性 相邻 兄弟 (全当复习,如果有用的话那就正好) div[name=zhang]  这是属性 ...

  3. redhat6.0下配置DNS

    最近操作系统要结课,老师要求在redhat上配置各种服务器角色,包括dhcp.ftp.web.dns.前三个都还好,但就dns,被折磨的死去活来的,真让人头大.还好在同学的帮助下最后配置成功,实现了正 ...

  4. SQL注入与防御

    SQL注入与防御 下载:https://pan.baidu.com/s/1ZiLVY2IxHXD9-bMRS61Fzg 提取码:yof2

  5. 吐槽:那些Java设计中不得不说的槽点

    1. 求长度各有千秋 你是否曾经在面试的时候,经常被问到:数组有没有 length() 方法?字符串有没有 length() 方法? 集合有没有 length() 方法? 面对这个问题,那么不得不吐槽 ...

  6. SqlDataReader的用法 转自https://www.cnblogs.com/sunxi/p/3924954.html

    datareader对象提供只读单向数据的快速传递,单向:您只能依次读取下一条数据;只读:DataReader中的数据是只读的,不能修改;相对地,DataSet中的数据可以任意读取和修改 01.usi ...

  7. HDU 4055:Number String(DP计数)

    http://acm.hdu.edu.cn/showproblem.php?pid=4055 题意:给一个仅包含‘I','D','?'的字符串,’I'表示前面的数字比后面的数字要小(Increase升 ...

  8. Anemic Model

    In object-oriented programming, and especially in Domain-Driven Design, objects are said to be anemi ...

  9. Python Day_1

    听说Python很6,然后我的偶像小甲鱼竟然在6年前(现在2019年)就开始制作Python的教程,而前不久(世界读书日前一个星期左右),京东有活动,小甲鱼的Python第一版本打折,顺便买了本(还凑 ...

  10. IDM 6.27.5(Internet Download Manager)中文破解版下载神器

    IDM一直是我最喜欢的下载工具,感觉用的比迅雷爽,简单使用,对付网盘有一套.IDM(Internet Download Manager)和迅雷的下载提速方式不同,从原理上来说,IDM速度较稳定,迅雷下 ...