C++ string类专题(修订版)
- 格式:pdf
- 大小:183.05 KB
- 文档页数:9
c++ string类的常用方法一、C++ string类的常用方法1、string类的构造函数string() // 构造空串string(const char* s) // 把null结尾的字符串s拷贝到字符串中string(const string& str) // 拷贝构造函数,复制str到此串string(char c, int n) // 用n个字符c构造串string(const char* s, int n) // 拷贝字符数组中前n个字符2、string类的成员函数2.1 长度控制函数int size() const; // 返回字符串的长度int length() const; // 返回字符串的长度,等价于size()void resize(int n, char c); // 改变字符串长度,如果n 大于原来的长度,用字符c来填充2.2 内容操作函数string& operator=(const char* s); // 赋值,把s的内容复制到字符串中string& assign(const char* s); // 赋值,把s的内容复制到字符串中string& append(const char* s); // 把字符串s添加到串尾string& append(const char* s, int n); // 把s前n个字符添加到串尾string& insert(int p0, const char* s); // 在p0位置上插入字符串sstring& erase(int p0, int n); // 删除p0开始,n个字符int find(const char* s, int pos=0); // 在pos之后查找子串s,返回子串s在原串中的起始位置int find(char c, int pos=0); // 从pos开始查找字符c,返回字符c在原串中的位置int rfind(const char* substr,int pos=npos); // 从pos开始向前查找子串substr,返回子串substr在原串中的起始位置int rfind(char c, int pos=npos); // 从pos开始向前查找字符c,返回字符c在原串中的位置string substr(int pos, int n); // 返回串pos 位置开始,长度为n的子串2.3 字符串比较函数int compare(const char* s); // 比较原串和sint compare(int p0, int n, const char* s); // 比较串中p0开始,n个字符的子串和s2.4 数据访问函数char& operator[](int i); // 返回串中第i个字符的引用const char& operator[](int i) const; // 返回串中第i个字符的引用const char* c_str() const; // 返回字符串以null结尾的字符串2.5 输入输出函数ostream& operator<<(ostream& os, const string& str); // 输出字符串istream& operator>>(istream& is, string& str); // 输入字符串。
C++string类成员函数c_str()的⽤法1.string类成员函数c_str()的原型:const char *c_str()const;//返回⼀个以null终⽌的c字符串2.c_str()函数返回⼀个指向正规c字符串的指针,内容和string类的本⾝对象是⼀样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式;3.操作c_str()函数的返回值时,只能使⽤c字符串的操作函数,如:strcpy()等函数.因为,string对象可能在使⽤后被析构函数释放掉,那么你所指向的内容就具有不确定性.eg: char * name[20];string ptr = "tongnono";strcpy(name,ptr.c_str());//c_str()返回的是⼀个临时的指针变量,不能对其操作.语法:const char *c_str();c_str()函数返回⼀个指向正规C字符串的指针常量, 内容与本string串相同.这是为了与c语⾔兼容,在c语⾔中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:⼀定要使⽤strcpy()函数等来操作⽅法c_str()返回的指针⽐如:最好不要这样:char* c;string s="1234";c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理,同时,编译器也将报错——将⼀个const char *赋与⼀个char *。
应该这样⽤:char c[20];string s="1234";strcpy(c,s.c_str());这样才不会出错,c_str()返回的是⼀个临时指针,不能对其进⾏操作再举个例⼦c_str() 以 char* 形式传回 string 内含字符串如果⼀个函数要求char*参数,可以使⽤c_str()⽅法:string s = "Hello World!";printf("%s", s.c_str()); //输出 "Hello World!"⽐如定义⼀个函数func(const char *s){ //s+1这个指针是对的};func(string s){//s+1是错的};主函数中: string str;调⽤这个函数时可以为 func(s.c_str());。
课程名称: C++程序设计课程代码:05题目: 字符串类的设计年级/专业/班: 软件工程2班学生姓名:学号:指导教师: 袁辉勇开题时间: 2011 年 5 月 15 日完成时间: 2011 年 6 月 5 日—湖南人文科技学院计算机系目录一引言 (3)二设计目的与任务 (3)三设计方案 (4)1 总体设计 (4)2 详细设计 (4)四程序清单 (4)五程序调试与体会 (10)六运行结果 (14)七结论................................................. 错误!未定义书签。
八参考文献............................................... 错误!未定义书签。
摘要本设计通过定义字符串类来实现对字符串的赋值、连接、复制、查找、交换操作。
首先定义一个字符串类,通过调用字符串类中成员函数,对字符串类进行赋值,然后实现了字符串类之间的连接,字符串类之间的相互复制,字符串类之间的交换,最后可以对该字符串类中的字符串进行查找。
关键字:字符串;类;成员函数;对象AbstractBy defining the design of this type of string to string to the realization of the assignment, to connect, copy, find, exchange operations. First of all, the definition of a type of string, by calling members of the String class function, the type of string for assignment, and then realized the connection between the type of string, string-type between the copy, between string-type In exchange, the last class to the string of string to find.Keywords: string; category; members of the function; object 。
c++ string类的常用方法x1、string类的构造函数string类的构造函数有三种:(1)默认构造函数:string();(2)以字符串常量指针为参数的构造函数:string (const char *s);(3)以字符串对象为参数的构造函数:string (const string &str);2、string类的赋值操作string类的赋值操作有以下几种:(1)以字符串常量指针为参数的赋值运算符重载:string & operator = (const char *s);(2)以字符串对象为参数的赋值运算符重载:string & operator = (const string &str);(3)拼接函数:string &append (const string &str);(4)两个字符串的拼接:string + string;3、string类的比较操作string类的比较操作有如下几种:(1)比较两个字符串是否相等的比较操作符:string==string;(2)比较两个字符串是否不等的比较操作符:string!=string;(3)比较两个字符串大小的比较操作符:string>string;4、string类的查找操作string类的查找操作有以下几种:(1)查找从某个位置开始某个子串的位置的函数:size_tfind(const string &str,size_t pos = 0);(2)查找从某个位置开始某个字符的位置的函数:size_tfind(char c,size_t pos = 0);(3)查找从右向左某个子串的位置的函数:size_t rfind(const string &str,size_t pos = string::npos);(4)查找从右向左某个字符的位置的函数:size_t rfind(char c,size_t pos = string::npos);5、string类的修改操作string类的修改操作有以下几种:(1)插入字符串的函数:string &insert (size_t pos, const string &str);(2)替换某个子串的函数:string &replace (size_t pos, size_t len, const string &str);(3)删除某个子串的函数:string &erase (size_t pos = 0, size_t len = npos);(4)在字符串前面补充某字符的函数:string &insert (size_t pos, size_t n, char c);(5)清除字符串的函数:void clear();6、string类的截取操作string类的截取操作有以下几种:(1)从某个位置截取字符串的函数:string substr (size_t pos = 0, size_t n = npos);(2)将字符串按照一定的字符分割成多个小字符串的函数:vector<string> split(char c);(3)删除收尾处的某字符的函数:string &trim(char c);。
string类特点
string类是一种在编程中常用的数据类型。
它是一种不可改变的字符序列,即一旦创建,就不能修改。
string类的特点如下:
1. 不可修改:string类的对象在创建后不能被修改。
如果需要修改一个字符串,需要创建一个新的字符串对象。
这个特点保证了字符串的安全性和稳定性。
2. 可以进行各种操作:尽管string类的对象不可修改,但是我们可以对字符串进行各种操作,比如拼接、查找、替换等。
这些操作会生成一个新的字符串对象并返回,不会修改原有的字符串。
3. 字符串连接使用"+"运算符:string类支持使用"+"运算符进行字符串连接操作。
可以将两个或多个字符串连接在一起,生成一个新的字符串。
4. 常用的字符串操作方法:string类提供了许多常用的方法,用于字符串的操作和处理,比如获取字符串的长度、截取子串、转换大小写等。
5. 字符串是不可变的:由于字符串的不可修改性,每次对字符串进行操作时都会重新生成一个新的字符串对象。
这样可能会造成内存的浪费,特别是在进行大量操作的情况下。
总的来说,string类提供了方便的字符串操作方法,但是由于不可修改的特性,需要在使用时注意避免频繁地生成新的字符串对象,以减少内存占用。
string的几种构造函数在编程中,字符串(string)是一种非常常用的数据类型,用于存储和操作文本。
在C++语言中,string类是用来表示和操作字符串的类。
string类提供了多个构造函数,用于创建字符串对象。
本文将介绍string的几种构造函数,并详细解释它们的用法。
1. 默认构造函数string类的默认构造函数创建一个空的字符串对象。
空字符串是一个长度为0的字符串,不包含任何字符。
我们可以使用以下语法来创建一个空字符串对象:string str;2. 字符数组构造函数string类还提供了一个构造函数,可以使用字符数组来创建字符串对象。
字符数组是一系列字符的集合,以null字符('\0')结尾。
我们可以使用以下语法来创建一个字符串对象:char arr[] = "Hello";string str(arr);这样,str将包含字符数组arr中的所有字符,并以null字符结尾。
需要注意的是,字符数组的长度必须小于或等于字符串对象的最大长度。
3. 字符串构造函数除了字符数组,我们还可以使用另一个字符串来创建字符串对象。
string类提供了一个接受另一个字符串作为参数的构造函数。
我们可以使用以下语法来创建一个字符串对象:string str1 = "Hello";string str2(str1);这样,str2将包含与str1相同的内容。
这个构造函数会创建一个新的字符串对象,而不是简单地将str2指向str1。
4. 子字符串构造函数string类还提供了一个构造函数,可以使用另一个字符串的一部分来创建一个新的字符串对象。
我们可以使用以下语法来创建一个子字符串对象:string str1 = "Hello World";string str2(str1, 0, 5);这样,str2将包含str1中从索引0开始的5个字符,即"Hello"。
string的各种函数(系统学习)1、按照⾯向对象的要求,可以把字符串看作⼀个对象,设计⼀个串类加以描述。
但是,在⼀般的情况下不必建⽴⾃⼰的串类,c++标准在库<string>中给出了类string,提供了丰富的串操作,程序员使⽤指令: #include<string>即存取这个类。
可将类string视为⼀个容器类,其部分操作如下:构造函数:string s:构造⼀个空串sstring s(a):构造串s,并⽤字符数组a初始化string s(a,n):构造串s,⽤字符数组a的前n个字符初始化string s(str):⽤串str构造串s(拷贝初始化)看下⾯代码验证#include<iostream>#include<string.h>#include<map>#include<cstdio>#include<cstring>#include<stdio.h>#include<cmath>#include<ctype.h>#include<math.h>#include<algorithm>#include<set>#include<queue>typedef long long ll;using namespace std;const ll mod=1e9+7;const int maxn=1e5+10;const int maxk=3e5+10;const int maxx=1e4+10;const ll maxe=1000+10;#define INF 0x3f3f3f3f3f3f#define Lson l,mid,rt<<1#define Rson mid+1,r,rt<<1|1int main(){char a[maxn];cin>>a;//输⼊abcdefghstring s(a);//结果为abcdefghstring s1(a,5);//结果为abcdestring s2(s1);//结果为abcdecout<<s<<endl;cout<<s1<<endl;cout<<s2<<endl;return0;}输⼊输出:getline(cin,s,delim):从cin中提取字符存⼊串s中,当遇到delim或者提取的字符个数等于s的长度时结束,如果⾃⼰不设定,默认为'\n' getline(cin,s):遇到'\n'结束cin>>s:遇到空⽩字符终⽌提取,空⽩字符不被读取cout<<s:输出s#include<iostream>#include<string.h>#include<map>#include<cstdio>#include<cstring>#include<stdio.h>#include<cmath>#include<ctype.h>#include<math.h>#include<algorithm>#include<set>#include<queue>typedef long long ll;using namespace std;const ll mod=1e9+7;const int maxn=1e5+10;const int maxk=3e5+10;const int maxx=1e4+10;const ll maxe=1000+10;#define INF 0x3f3f3f3f3f3f#define Lson l,mid,rt<<1#define Rson mid+1,r,rt<<1|1int main(){string s;while(getline(cin,s,'#')){getchar();//⾃⼰指定了字符要加getchar,不然结果会多出⼀个换⾏,但是默认情况下不⽤加getcharcout<<s<<endl;}return0;}操作符:s=val:赋值操作,val可以是⼀个串,⼀个字符或⼀个字符数组s+=val:将val添加到串s之后s[pos]:下标操作s+t,t+s:s和t的连接,返回连接的结果。
C++中string,wstring,CString常⽤⽅法⼀.概念 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳⼊C++标准之中.wstring是操作宽字符串的类.C++标准程序库对于string的设计思维就是让他的⾏为尽可能像基本类型,不会在操作上引起什么⿇烦。
CString是对string(字符串)和wstring(宽字符串)的⼀个封装,常⽤在mfc中.⽤来解决编码问题的. string/wstring和CString在使⽤中,要根据实际环境选取。
CString是MFC⾥的,string是STL⾥的,后者通⽤性强些,前者功能全些。
⼀般在mfc中使⽤CString更为好⼀些。
⼆.常⽤⽅法string/wstring常⽤⽅法:string类的构造函数:string(const char *s); //⽤const字符串s初始化string(int n,char c); //⽤n个字符c初始化此外,string类还⽀持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。
当构造的string太长⽽⽆法表达时会抛出length_error异常;string类的字符操作:const char &operator[](int n)const;const char &at(int n)const;char &operator[](int n);char &at(int n);operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。
const char *data()const;//返回⼀个⾮null终⽌的c字符数组const char *c_str()const;//返回⼀个以null终⽌的c字符串int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数⽬string的特性描述:int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)int max_size()const; //返回string对象中可存放的最⼤字符串的长度int size()const; //返回当前字符串的⼤⼩int length()const; //返回当前字符串的长度bool empty()const; //当前字符串是否为空void resize(int len,char c);//把字符串当前⼤⼩置为len,并⽤字符c填充不⾜的部分string类的输⼊输出操作:string类重载运算符operator>>⽤于输⼊,同样重载运算符operator<<⽤于输出操作。
本文作者:黄邦勇帅(编著)(原名:黄勇)本文是学习C++的附加内容,主要介绍了C++中的string类的各种成员函数,及成员函数的功能与作用,是作为学习C++的参考使用的。
本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正本文使用的是x86机器(主流计算机都是x86机器),windows xp操作系统,VC++2010编译器进行讲解的。
本文内容完全属于个人见解与参考文现的作者无关,限于水平有限,其中难免有误解之处,望指出更正。
声明:禁止抄袭,复印,转载本文,本文作者拥有完全版权。
主要参考文献:1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社 2005年5月2、C++.Primer第四版.中文版 Stanley B.Lippman、Barbara E.Moo、Josee Lajoie著李师贤、蒋爱军等译人民邮电出版社 2006年3月3、C++.Primer第三版.中文版 Stanley B.Lippman、Josee Lajoie著潘爱民、张丽等译中国电力版社 2002年5月第19部分 string类专题(共9页)(2016-7-15 修订版)1、string类用于处理字符串,用于代替使用不方便的C风格字符串,使用string类表示的字符串我们可以像处理普通变量那样处理字符串,因此可以对string类表示的字符串进行直接的相加,比较,赋值等操作,比如string s1=”abc”,s2=”def”;则s1=s1+s2;结果s1=”abcdef”;s1=s2;则结果s1=”def” 等,C风格字符串只能使用内置的库函数进行这些操作,使用很不方便,比如char c1[]=”abc”; char c2[]=”def”;则c1=c2;错误,不能改变数组的地址,c1>c2比较的是两个指针的地址而不是字符的大小;c1+c2;错误,这是把两个指针的地址相加而不是把两个字符数组相加。
2、string对象创建的字符串的最大特点是:可以自动调整对象大小以适应所需的字符串,string对象能存储的最大字符数由string类的静态常量string::npos设定,通常是最大的unsigned int值。
一、string类的原型1、要使用string类需要包含string头文件。
2、string是一个模板类,因此它具有类和模板的特性,也就是说string类有构造函数、重载的操作符、成员函数等,因为string是模板类,因此应建一个模板类具体实例化版本的对象才能使用,然后通过对象调用成员函数使用类。
3、记住string s;创建的s是一个类的对象,而不是字符串字面值,他们是两种不同的类型。
4、string类是模板类basic_string类的char特化体版本使用typedef命名后的别名,wstring类是模板类basic_string的wchar特体化版本使用typedef命名后的别名。
5、basic_string类的原型为(重点):template<class charT, class traits=char_traits<charT>, class Allocator=allocator<charT> > class basic_string;1)、charT是个类型模板形参,若实例化时传递char类型,则charT=char,传递wchar则charT=wchar2)、traits是类型模板形参,描述了字符串的特征,比如字符串是否以’\0’作为结束尾等。
traits要求传递一个char_traits<T>的模板类型作为实参。
3)、Allocator也是个类模板形参,他的主要作用是用于处理字符串的内存分配问题,默认使用new和delete分配内存。
Allocator要求传递一个allocator<T>类型的模板类型作为实参。
4)、basic_string有两个特化体版本(重点),如下所示,当然我们也可以实例化其他类型版本的base_string类模板,①、typedef base_string<char> string; //即string类是使用typedef重命名后的basic_string类模板的char特化体版本。
②、typedef base_string<wchar_t> wstring; //主要用于处理宽字符串。
6、size_type类型(重要):size_type是basic_string类中定义的类型,一般被定义为unsigned类型。
需要使用限定名的方法来使用size_type类型,比如string::size_type a;或basic_string<char>::size_type a;7、npos静态常量(重要):表示string对象能够存储的最大字符数,其形式为:static const size_type npos=-1; 可见npos是basic_string类中定义的静态常量,其类型为size_type其值为-1,对于无符号的size_type变量,赋值为-1,相当于是把最大的无符号数赋值给了他。
二、string类的构造函数1、basic_string的构造函数与char特化版本的string构造函数的差别,只在于basic_string构造函数多了一个用于分配内存的默认形参const Allocator& a=Allocator(); 比如string类的构造函数string(const char *s);其对应的basic_string 构造函数形式为basic_string(const charT* s, const Allocator& a=Allocator());2、string类有6种形式的构造函数,本文使用basic_string类模板简化后的string构造函数版本。
1)、原型1:string();意义:创建一个默认的string对象,长度为0。
示例:string s; 表示创建一个长度为0的字符串对象s。
2)、原型2:string(const char *s);意义:将string对象初始化为s指向的传统C风格字符串(即以空字符结束的字符串)。
示例:string s(“hyong”);则结果为s=”hyong”。
3)、原型3:string(size_type n,char c);意义:创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c。
示例:string s(4, ‘c’);则结果为s=”aaaa”。
4)、原型4:string(const string &str, size_type pos=0, size_type n=npos); //这是复制构造函数。
意义1:将string对象初始化为str中从pos开始的n个字符,或从pos开始到结尾的字符,其中npos表示string对象的最大长度。
示例1:string s=”ABCDEFG”; string s1(s,2,4);则结果s1=”CDEF”; 再如string s2(s,2);结果为s2=”CDEFG”;意义2:该构造函数的默认值形式为复制构造函数,经常被用于创建一个已存在的string对象的副本,示例2:string s=”CDEF”; string s1(s); 则s1=s=”CDEF”意义3:若指定的字符个数大于源字符串的长度,则使用源字符串到末尾的字符初始化目标string对象,示例3:string s(“ABDE”); string s1(s,0,22);则s1=”ABDE”;意义4:pos的值不能大于源字符串的长度,否则抛出out_of_range异常。
示例4:string s(“ABCD”); string s1(s,22);错误5)、原型5:string(const char *s, size_type n);意义:将string对象初始化为s指向的传统C字符串中的前n个字符,即使超出了字符串的范围,操作仍会进行。
示例:char c[]=”hyong”; string s(c, 5);结果为s=”hyong”。
注意即使复制的长度超出了数组的长度,操作仍将进行,也就是说如果把5改为10的话,将导致5个无用的字符被复制到对象中。
6)、原型6:tempalte<class Iter>string(Iter begin, Iter end);意义:将string对象初始化为[begin, end)间的字符,其中begin和end类似于指针用于指定位置,范围包括begin在内,但不包括end,注意不包括end。
还要注意begin和end被看着指针,该方法可用于数组、字符串和STL容器。
示例1:char c[ ]=”hyongilfmm”; string s(c+2, c+4); 结果s=”on”表示使用从指针c指向的字符串”hyongilfmmm”,位于区间[2,4)的字符”on”初始化s,注意第4个字符不包括在内。
注意,字符串从0开始计数。
示例2:string a=”hyong”;string b(a+3, a+5);是错误的,因为begin和end被看着指针指向的某一位置,而a 是string类对象,而不是指针,所以a+3没有意义,所以这里应这样string b(&a[3], &a[5])表示的是指针所指区间[&a[3], &a[5])之内的字符,相当于是从&a[3]开始的&a[5]-&a[3]个字符。
注意&a+3与&a[3]表示的是不同的意义,&a;表示string对象的地址,&a[3]表示string对象”hyong”中第3个字符所在位置的地址。
三、string类对象的特点1、不能用单个字符来初始化string对象,比如string a=’d’;将是错误的,但是string a(1,’d’)是正确的,这里将把’d’初始化为”d”。
2、string对象只能接收以空字符结尾的字符串,比如语句char b[ ]={‘a’, ‘b’, ‘c’}; string a=b;将是错误的。
3、不能将string对象的字符串赋值给char类型的数组或指针,因为他们是两个不同的类型。
四、string对象的输出输出1、 string对象的输入:可以使用cin和getline函数对string对象进行输入,注意:此处的geline函数不是istream流的成员函数。