C++ string类专题(修订版)

C++ string类专题(修订版)
C++ string类专题(修订版)

本文作者:黄邦勇帅(编著)(原名:黄勇)

本文是学习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 Allocator=allocator > class basic_string;

1)、charT是个类型模板形参,若实例化时传递char类型,则charT=char,传递wchar则charT=wchar

2)、traits是类型模板形参,描述了字符串的特征,比如字符串是否以’\0’作为结束尾等。traits要求传递一个

char_traits的模板类型作为实参。

3)、Allocator也是个类模板形参,他的主要作用是用于处理字符串的内存分配问题,默认使用new和delete分配内

存。Allocator要求传递一个allocator类型的模板类型作为实参。

4)、basic_string有两个特化体版本(重点),如下所示,当然我们也可以实例化其他类型版本的base_string类模板,

①、typedef base_string string; //即string类是使用typedef重命名后的basic_string类模板的char特化体版本。

②、typedef base_string wstring; //主要用于处理宽字符串。

6、size_type类型(重要):size_type是basic_string类中定义的类型,一般被定义为unsigned类型。需要使用限定名的

方法来使用size_type类型,比如string::size_type a;或basic_string::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:tempaltestring(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流

的成员函数。

2、使用cin输入string对象:有关cin的更多特性请参阅相关章节

1)、cin会忽略开始的所有空白符(包括空格、回车换行符、制表符等)。

2)、读到取空白字符时结属对string对象的读取。比如string s,s1; cin>>s>>s1;若输出sss ddd,则s=”sss”; s1=”ddd”

3、 string类的getline()函数

getline函数原型:template basic_istream&

getline(basic_istream& is, basic_string& str, charT delim=’\n’);

简化的getline函数原型:istream& getline(istream& is, string& str, char delim);

1)、表示把输入流is中的字符读入到字符串str中,直到遇到分界符delim,或到达文件尾或到达字符串的最大长度,

getline不会忽略空白符,比如string s; getline(cin,s,’z’);假设输入ddd sssz则s=”ddd sss”;

2)、getline会自动调用string对象的大小,以使刚好能容纳输入的字符,因此在getline函数中不需要指定读到多少

个字符的参数。

3)、getline是一个独立的函数,只需直接调用即可,它不是istream的成员函数。比如string s; getline(cin,s);而

s.getline(cin,s);错误,getline不是类的成员函数。

4)、若第一个字符就是分界符,则string对象被设为空string。

5)、分界符delim将被读取并丢弃,但不会被赋值给string对象;若不指定分界符,则默认为回车换行符’\n’;若指

定的分界符,则回车换行符会被当成字符读入string对象。比如string s,s1; getline(cin,s,’z’); cin>>s1; 假设输入aa↙bbzcc;则s=”a a↙bb”; s1=”cc”; 其中↙表示回车换行符。

6)、getline反回的是istream引用。因此若到达文件尾会设置eofbit状态,若读取的字符数超过string允许的最大数

(string::npos的值),则设置failbit位。

7)、第一个参数必须是一个输入流的对象,比如标准输入流cin。

8)、这个版本的getline函数只能适用于string对象,应注意与接受char*字符的getline函数的区别。

对于以下函数原型都是使用的简化后的版本,即使用basic_string的char特化版本,并使用typedef重命名后的string 类型。因此只需把以下函数原型中的string替换为basic_string,char替换为charT即为basic_string的完整版本原型。

五、与string类有关的操作符函数

1、C++为string类实现了赋值、关系运算符、下标运算符、加操作符,这些操作符有些是string类的成员,有些不是

string类的成员,

2、是否是成员的差别在于左侧是否必须是string类的对象,比如char c[33]; string s=”aaa”; 则c=s;错误,因为=操作符

是string类的成员函数,左侧必须是string类对象才是正确的对重载的=操作符的调用。

3、赋值操作符=

1)、是string类的成员函数,

2)、可使用string对象、字符串数组、单个字符对string类对象进行赋值。这意味着C++对这三种类型重载赋了三

个版本的赋值操作符,即形如operator =(string&)、operator=(char *)、operator=(char)的三个重载版本。

3)、赋值操作符会把以前的数据清空再重新写入,而不是对原有数据的修改。比如string s=”abcde”; s=”AB”; 则结

果s=”AB”;而不是s=”ABcde”

4)、示例:string s=”aa”; 则s=”bb”; s=’a’;都是正确的。但string s=’a’;错误,这是初始化不是赋值,因为没有接受

char类型的string构造函数,所以出错。

4、关系操作符:

1)、除!关系操作符外,C++都为string类实现了其余的关系操作符,

2)、关系操作符不是string类的成员函数,

3)、可使用string对象、字符串数组的各种组合作为操作数,这意味着所有关系运算符都对这两种类型的各种组合

都进行了重载。

4)、注意:单个字符不能作为关系运算符的操作数。

5)、示例:string s=”aaa”; 则s>”a”; “A””BB”都是正确的,但s>’a’; “AA”>’A’;错误。

6)、关系操作符的比较规则:

①、按顺序比较第一个不相同的字符作为结果。

②、排在前面的字符小于排在后面的字符,比如a小于b。

③、若两个string对象长度相同,且长的string对象的前面部分与短的string对象相同,则短的string对象更小。

④、大写字母小于任意的小写字母。

⑤、示例:string s=”Zabc”; 则s>”aabc”; 结果为0; s>”Zab”;结果为1; s>”Yab”;结果为1;s>”a”;结果为0。

6、下标操作符:

1)、必须是成员函数

2)、反回的是char类型的引用,因此下标操作符可以作为左值使用,这意味着可以使用下标操作符对字符串中的某

个字符进行修改。

3)、下标操作符不会进行边界检查,若超出数组的范围会引发严重错误。

4)、示例:string s=”abcd”; 则s[1]=’c’;结果s=”accd”;

7、+加操作符:

1、可用于把第二个字符串追加到第一个字符串的后面

2、加操作符不是string类的成员函数。

3)、加操作符不会修改被加的字符串,而是创建一个新字符串。比如string s=”abc”; string s1=s+”de”; 则结果s=”abc”;

s1=”abcde”; 其中s的值未被改变。

4)、注意:加操作符的操作数不能是单个的字符。比如string s=”abc”;则string s1=s+’d’;错误。

5)、加操作符的两个操作数必须至少有一个是string类型的。比如”abc”+”de”;错误,string s=”abc”; 则string s1=”d”+s;

正确。但string s1=”ab”+”cd”+s;错误,因为”ab”+”cd”没有一个是string类型的。

8、+=操作符:

1)、用于把第二个字符追串追加到第一个字符串的后面,比如string s=”abc”; s+=”de”;则结果s=”abcde”;

2)、+=操作符是成员函数,这意味着+=的左操作数必须是string类型的对象。比如string s=”abc”; 则”de”+=s;错误。

3)、+=操作符的右操作数可以是string对象、字符串数组、单个字符,比如string s=”abc”; s+=’D’;则s=”abcD”

六、与操作符类似的string成员函数

1、at(n)成员函数:该函数与下标操作符相同,唯一的区别是at会进行边界检查,若超出数组范围会抛出out_of_range

异常,比如string s=”abcde”; s.at(2)=’e’; 则结果s=”abede”; 但s.at(22);错误,抛出out_of_range异常。

2、compare成员函数:比较

1)、通用规则:

(1)、用于比较两个字符串,对应关系操作符,其比较规则见关系操作符

(2)、https://www.360docs.net/doc/1c5540702.html,pare(s2)反回值的规则如下(所有版本的compare比较结果都按下面规则取值):

①、s1>s2;反回正数

②、s1

③、s1=s2反回0

2)、原型1:int compare(const string &s) const;

意义:使用s与原string对象进行比较。

示例:string s1=”abc”; string s2=”abe”; int n=https://www.360docs.net/doc/1c5540702.html,pare(s2); 结果s1

3)、原型2:int compare(size_type pos, size_type n, const string &s) const;

意义:使用原string对象中从位置pos开始的n个字符与s进行比较。

若起始位置pos超过原string对象的长度,则抛出out_of_range异常

示例:string s1=”abcdef”; string s2=”abcc”; int n=https://www.360docs.net/doc/1c5540702.html,pare(2,3,s2); 此时s1=”cde”; 结果s1>s2; n=1;

4)、原型3:int compare(size_type pos1,size_type n1, const string &s, size_type pos2, size_type n2) const;

意义:使用原string对象中从pos1开始的n1个字符与s中从pos2开始的n2个字符进行比较。

示例:string s1=”abcdefgh”; string s2=”abcc”; int n=https://www.360docs.net/doc/1c5540702.html,pare(2,3,s2,1,2); 此时s1=”cde”,s2=”bc”,结果s1>s2; n=1

5)、原型4:int compare(const char *c) const; //原型1的char数组版本

调用方法:https://www.360docs.net/doc/1c5540702.html,pare(c); 表示把s与c进行比较

示例:string s1=”abc”; char c[]=”cde”; int n=https://www.360docs.net/doc/1c5540702.html,pare(c); 结果s

6)、原型5:int compare(size_type pos1, size_type n1, const char* c, size_type n2=npos) const; //原型3的char版本

调用方法:https://www.360docs.net/doc/1c5540702.html,pare(2,3,c,2); 表示使用s1中从位置2开始的3个字符与c中前2个字符进行比较。

示例:string s1=”abcdef”; char c[]=”cdef”; int n=https://www.360docs.net/doc/1c5540702.html,pare(2,3,c,2); 此时s=”cde”; c=”cd”;结果n=1;

3、append()成员函数:追加

1)、该函数用于将一个字符串追加到另一个字符串的后面,其使用功效与使用+=相似。

2)、原型1:string &append(const string& s);

意义:把字符串s的内容追加到原string对象的末尾

示例:string s1=”ab”; string s2=”cd”; s1.append(s2); 结果s1=”abcd”;

3)、原型2:string& append(const string& s, size_type pos, size_type n);

意义:把字符串s中从位置pos开始的n个字符追加到原string对象的末尾。

示例:string s1=”ab”; string s2=”defg”; s1.append(s2,1,2);结果s1=”abef”;

4)、原型3:string& append(const char* c); //原型1的char版本

意义:把字符数组c中的内容追加到原string对象的末尾。

示例:string s=”ab”; char c[]=”cd”; s.append(c); 结果s=”abcd”;

5)、原型4:string& append(const char* s, size_type n); //原型2的char版本

意义:把字符数组c中的前n个字符追加到原string对象的末尾。

示例:string s=”ab”; char c[]=”abcdef”; s.append(c,2); 结果s=”abab”;

6)、原型5:basic_string& append(size_type n, char c);

意义:追加n个字符c追到原sring对象的末尾

示例:string s=”ab”; s.append(3,’c’); 结果s=”abccc”;

7)、原型6:template string& append(InputIterator first, IputIterator last);

调用方法:s.app(c+2,c+5);表示把指针c所指字符串,位于区间[2,5)的字符追加到s,注意c必须要是指针。

示例:string s=”ab”; char c[]=”abcdefgh”; s.append(c+2,c+5); 指针c指出的字符串”abcdefgh”,位于区间[2,5)的字符为”cde”,注意不包括末尾的区间5。结果s=”abcde”

4、assign()成员函数:赋值

1)、该函数用于将一个字符串赋给另一个字符串,功能与使用=赋值运算符相似。

2)、原型1:string& assign(const string& s);

意义:使用字符串s中的内容替换原string对象中的内容

示例:string s1=”abc”; string s2=”def”; s1.assign(s2); 结果s1=”def”

3)、原型2:string& assign(const string& s, size_type pos, size_type n);

意义:使用字符串s中从位置pos开始的n个字符替换原string对象中的内容。

示例:string s1=”ab; string s2=”abcdef”; s1.assign(s2,2,3); 结果s1=”cde”

4)、原型3:string& assign(const char* c, size_type n);

意义:使用字符数组c中的前n个字符替换原string对象中的内容。

示例:string s=”ab”; char c[]=”cdefg”; s.assign(c,3); 结果s=cde;

5)、原型4:string& assign(const char* c);

意义:使用字符数组c中的内容替换原string对象中的内容。

示例:string s=”ab”; char c[]=”cde”; s.assign(c); 结果s=”cde”;

6)、原型5:string& assign(size_type n, char c);

意义:使用n个字符c替换原string对象中的内容。

示例:string s=”ab”; s.assign(3,’c’); 结果s=”ccc”;

7)、原型6:template string& assign(InputIterator first, InputIterator last);

调用方法:s.assign(c+2,c+5);表示使用指针c把所指区间[2,5)中的字符替换s中的内容。

示例:string s=”ab”; char c[]=”abcdefgh”; s.assign(c+2,c+5); 指针c所指字符串为”abcdefgh”;在区间[2,5)中的字符为cde;注意不包括末尾的区间5,结果s=”cde”

5、以上函数的越界处理规则及通用规则

1)、以上函数若指定的起始位置pos超过了该字符串的长度,都会抛出out_of_range异常。

2)、以上函数若指定的字符个数n超过字符串长度,不会出错,但对于字符数组会进行越界比较,对于string 对象

不会进行越界比较。因为对于下标运算符[],C++不会进行越界检查,所以字符数组会进行越界比较。

3)、以上函数在使用子串进行比较时,若是string对象,都要求指定起始位置pos,对于字符数组都不要求指定起始

位置pos,这意味着若子串是来自字符数组要少指定一个参数。

七、常用的string成员函数

1、substr成员函数:反回子串

原型:string substr(size_type pos=0, size_type n=npos)

意义:表示反回由pos开始的n个字符,如果指定的字符数超过了string对象的结尾,则substr()函数只反回从指定位置到string对象尾的字符。如果指定的起始位置超出了string对象的结尾,则抛出一个异常。

示例:string s1=”abcdefgh”; string s2=s1.substr(2, 3); string s3=s1.substr(2,44); 结果s2=”cde”; s3=”cdefgh”

2、copy()成员函数:复制字符串

原型:size_type copy(char* c, size_type n, size_type pos=0) const;

意义:将string对象中从位置pos开始的地方复制n个字符到目标数组c中。函数反回复制的字符数,该函数不追加空值字符,且不对目标数组c进行长度检查

注意:1、形参c是目标数组而不是源字符串,源字符串来自调用该函数的string对象。

2、起始位置和字符数与其他函数是相反的位置。

3、复制之后是改写目标数组的内容而不是替换。

4、此函数只能把string对象复制到字符数组中,而不能复制到string对象中。

5、若指定的字符数n超过了字符长度,则复制从指定位置到string对象尾的字符。若起始位置pos超过string

对象长度,则抛出out_of_range异常。

示例:string s=”ABCDEFG”; char c[]=”abcdefg”; s.copy(c,3,2); 结果:c=CDEdefg; 这些情形都会出错string s1=”abc”;则s.copy(s,1,1);错误不能复制到string对象中,s.copy(c,2,33);错误,起始位置超过string对象长度。

3、swap()成员函数原型:void swap(string& s); 表示交换两个string对象的内容;示例:string s1=”abc”; string s2=”def”;

s1.swap(s2);结果s1=”def”; s2=”abc”;

4、erase()成员函数:从字符串中删除字符。

1)、原型1:string& erase(size_type pos=0, size_type n=npos);从位置pos开始删除n个字符或删除到字符串尾。

示例:string s=”abcdefgh”; s.earse(2,3); 结果s=”abfgh”;

2)、原型2:iterator erase(iterator position);删除迭代器位置引用的字符,并反回指向下一个元素的迭代器,如果后面

没有其他元素则反回end();

3)、原型3:iterator earse(iterator first, iterator last);删除区间[first, last)中的字符,即删除从包括first开始的位置到不

包括last的位置之间的字符。它反回一个迭代器,该迭代器指向最后一个被删除的元素后面的一个元素。

5、string的内存分配策略(重点)

C++规定了使用string对象能够存储的最大字符数string::npos;这意味着使用的string对象最多只能存储这么多个字符,但不代表编译器一开始就会为string对象分配这么大的内存(容量),若每创建一个string对象就为其分配最大容量的内存这会严重浪费存储空间,所以在每创建一个string对象时,编译器一般按照16的倍数为string对象分配内存(容量),若string对象存储的字符数超过了当前分配的容量,则按16的倍数进行扩展。比如string s;一开始编译器可能会为其分配16个字节(VC++2010为15)的容量,若s存储的字符数超过了16个字符,则自动把容量扩大到32个字符,以此类推,但s的内存(容量)最多只能扩大到string::npos指定的数量。string::npos一般为最大的unsigned int值。

常用的string成员函数boole empty() const 若字符串为空则反回true

string &erase(pos=0, n=npos) 删除从位置pos开始的n个字符。

void clear() 删除字符串中的所有字符

size() 反回string对象的长度(不含终止字符’\0’),即

string对象中的实际字符个数。

length() 与size()相同,这是较早版本提供的函数capacity() 反回为string对象分配的容量,这个数字可能大

于size()的数目,若字符串的长度大于当前分配

的容量,则自动为string对象扩展容量。

max_size 当前string对象能够存储的最大字符长度,该长

度比string::npos小1,因为末尾需要存储一个

空字符。

void reserve(size_type n); 把capacity()(即容量)设置为大于或等于n的大

小。分配容量时是按16的倍数进行的,若分配

的容量小于当前的容量则忽略。示例:长度、容量、最大长度

以下的值因编译器和操作系统会有所不同 string s="abcdefg";

typedef string::size_type U;

U n1=s.size(); //n1=7

U n2=s.capacity(); //n2=15

U n3=s.max_size(); //n3=4294967294 U n4=string::npos; //n4=4294967295 s="12345678901234567"; //自动扩容

U n5=s.capacity(); //n5=31

s.reserve(34); //容量按16的倍数分配 U n6=s.capacity(); //n6=47

s.reserve(15); //分配的容量小于当前容量,被忽略

U n7=s.capacity(); //n7=47;

c_str() 反回指向C风格字符串第一个字符的指针。此函数可以把string对象转换为C风格的字

符串,转换之后的指针类型为const的。

示例:string s="abcde";

const char *c=s.c_str();//正确,

//char *c3=s; //错误,不能把string类型转换为char*类型

//char *c1=s.c_str();//错误,指针应是const的。

//const char c2[]=s.c_str();//错误,c_str反回的是指针。

data() 与c_str()相似。

void resize(size_type n)

void resize(size_type n, char c) 将字符串的长度修改为n,若n小于字符串的长度,则截短字符串,若n大于字符串的长度,则第一个resize函数使用空字符填充,第二个resize函数使用字符c填充。

示例:string s=”abcdef”; s.resize(3); s.resize(6); s.resize(8,’d’); 结果s=”abc dd”;

八、find、insert、replace成员函数

1、为使程序简洁,以下程序都使用int型,不使用string::size_type类型,这可能会出现数据溢出的情况。

2、在VC++2010中string::npos的值为-1,负1能使无符号数成为最大值,因为int型是有符号类型的,所以int

n=string::npos;则n=-1;

3、find成员函数:查找

1)、原型1:size_type find(const string &str, size_type pos=0) const

意义:从原string对象的位置pos处开始查找字符串str,如果找到,则反回该字符串首次出现时其首字符的索引,否则反回string::npos。

示例:string s1=”abcdefghijcdekl”; string s2=”cde”; int c1=s1.find(s2,1); int c2=s1.find(s2,3); int c3=s1.find(s2,11); 结果c1=2; c2=10; c3=-1;

2)、原型2:size_type find(const char *s, size_type pos=0) const //原型1的char版本

意义:从原string对象的位置pos处开始查找char字符数组s,如果找到,则反回该字符串首次出现时其首字符的索引,否则反回string::npos。

示例:string s1=”abcdeghcdek”;int c[]=”cde”;int n1=s1.find(c,1);int n2=s1.find(“cde”,3);结果n1=2; n2=7;

3)、原型3:size_type find(const char *s, size_type pos, size_type n)

意义:从原string对象的pos位置处开始,查找char字符数组s的前n个字符组成的子字符串,如果找到,则反回该子字符串首次出现时其首字符的索引,否则反回string::npos。注意这个版本的find

函数只适用于char类型的数组,而不适用于string对象,

示例:string s1=”abcdefghcdk”; string s2=”cde”; char c[]=”cde”;

int n1=s1.find(c,3,2); 由s1构成的子串为”defghcdk”; 由c构成的子串为”cd”; 所以结果n1=8。

int n2=s1.find(c,3,3); 由s1构成的子串为”defghcdk”; 由c构成的子串为”cde”;所以结果n2=-1;

int n3=s1.find(s2, 3, 2); 错误,s2不是char*类型。

4)、原型4:size_type find(char c, size_type pos=0) const

意义:从原string对象的位置pos处查找字符c,若找到,则反回字符首次出现的位置,否则反回string::npos

示例:string s1=”abcdefghcdk”; int n=s1.find(‘c’,4); 结果n=8;

4、insert成员函数:插入

1)、原型1:string& insert(size_type pos1, const string& str);

意义:将字符串tr插入到原string对象pos1位置的前面,

示例:string s1=”abcdef”; string s2=”gh”; s1.insert(2,s2); 结果s1=”abghcdef”;

2)、原型2:string& insert(size_type pos1,const string& str, size_type pos2, size_type n);

意义:将字符串str从位置pos2开始的n个字符插入到原string对象pos1位置的前面。

示例:string s1=”abcdef”; string s2=”ghiklmn”; s1.insert(2,s2,2,3); 结果s1=”abiklcdef”;

4)、原型3:string& insert(size_type pos, const char* s, size_type n);

意义:表示把char字符数组s的前n个字符插入到原string对象pos位置的前面。

示例:string s1=”abcde”; char c[]=”ghikl”; s1.insert(2,c,3); 结果s1=”abghicde”;

5)、原型4:string& insert(size_type pos, const char* s);//原型1的char版本。

意义:表示将整个char字符数组s插入到原string对象pos位置的前面。

示例:string s1=”abcde”; char c[]=”ghi”; s1.insert(2,c); 结果s1=”abghicde”;

6)、原型5:basic_string& insert(size_type pos, size_type n, char c);

意义:插入n个字符c到原string对象pos位置的前面。

示例:string s1=”abcde”; s1.insert(2,4,’x’);结果s1=”abxxxxcde”;

7)、原型6:iterator insert(iterator p, charT c=charT() );

8)、原型7:void insert(iterator p, size_type n, charT c);

9)、原型8:templatevoid insert(iterator p, InputIterator first, InputIterator last);

5、replace()成员函数:替换字符串

1)、原型1:string& replace(size_type pos1, size_type n1, const string& str);

意义:把原string对象从位置pos1开始的n1个字符替换为string对象str,不管str的长度是大于或小于要被替换的字符数n,原string对象的n个字符都会被替换为str。

示例:string s1=”abcdefg”; string s2=”hi”; s1.replace(2,4,s2);结果s1=”abhig”;

string s1=”abcdefg”; string s2=”hijklmn”; s1.replace(2,4,s2);结果s1=abhijklmng”;

2)、原型2:string& replace(size_type pos1, size_type n1, const string& str, size_type pos2, size_type n2);

意义:把原string对象从pos1开始的n1个字符替换为字符串str从pos2开始的n2个字符。不管选出的str的子串长度是大于或小于要被替换的字符数n1,原string对象的n个字符都会被替换为str的

子串。

示例:string s1="0123456"; string s2="abcdefghi"; s1.replace(2,4,s2,1,2); 结果s1=”01bc6”;

string s1="0123456"; string s2="abcdefghi"; s1.replace(2,4,s2,1,6); 结果s1=”01bcdefg6”;

3)、原型3:string& replace(size_type pos,size_type n1,const char* c, size_type n2);

意义:把原string对象从位置pos开始的n1个字符替换为char字符数组c的前n2个字符。其他规则见原型1和2。

示例:string s1="0123456"; char c[]="abcdefghi"; s1.replace(2,4,c,2);结果s1=”01ab6”

string s1="0123456"; char c[]="abcdefghi"; s1.replace(2,4,c,6);结果s1=”01abcdef6”

4)、原型4:string& replace(size_type pos, size_type n1, const char* c); //原型1的char版本

意义:把原string对象从位置pos开始的n1个字符替换为char字符数组c。其他规则见原型1和2。

示例:string s1="0123456"; char c[]="abcdefg"; s1.replace(2,4,c);结果s1=”01abcdefg6”

string s1="0123456"; char c[]="ab"; s1.replace(2,4,c);结果s1=”01ab6”

5)、原型5:string& replace(size_type pos, size_type n1, size_type n2, char c);

意义:把原string对象从位置pos开始的n1个字符替换为n2个char字符c。其他规则见原型1和2。

示例:string s1="0123456"; s1.replace(2,4,2,’x’) 结果s1=”01xx6”

string s1="0123456"; s1.replace(2,4,6,’x’) 结果s1=”01xxxxxx6”

6)、原型6:basic_string& replace(iterator i1, iterator i2, const basic_string& str);

7)、原型7:basic_string& replace(iterator i1, iterator i2, const charT* s, size_type n);

8)、原型8:basic_string& replace(iterator i1, iterator i2, const charT* s);

9)、原型9:basic_string& replace(iterator i1, iterator i2, size_type n, charT c);

10)、原型10:template basic_string&

replace(iterator i1, iterator i2, InputIterator j1, InputIterator j2);

九、其他查找成员函数

1、rfind成员函数:用于查找字符串最后一次出现的位置

1)、原型1:size_type rfind(const string& str, size_type pos=npos)const;

意义:在原string对象的位置pos之前(包括pos)查找str最后一次出现的位置,若未找到反回string::npos。

示例:string s1="01ab23456ab789"; string s2="ab";

int n1=s1.rfind(s2);结果n1=9;

int n2=s1.rfind(s2,5);结果n2=2; // 在s1中,位置之前模反s2的字符”ab”最后出现的位置。

int n3=s1.rfind(s2,9); 结果n3=9; //位置恰好位于s1的字符a第二出现的地方,查找时包括位置pos,因此字

符ab最后一次出现于此处。

2)、原型2:size_type rfind(const char* c, size_type pos=npos)const; //原型1的char字符数组版本,见原型1。

3)、原型3:size_type rfind(const char* c,size_type pos, size_type n)const;

意义:在原string对象的位置pos之前(包括pos)查找字符数组c的前n个字符最后一次出现的位置,若未找到反回string::npos。

示例:string s1="01ab23456ab789"; char c[]="ab";

int n1=s1.rfind(c,14,2);结果n1=9;

int n2=s1.rfind(c,5,2); 结果n2=2;

int n3=s1.rfind(c,9,2); 结果n3=9; 原因见原型1的示例

4)、原型4:size_type rfind(char c, size_type pos=npos)const; 原型1的char单字符版本,见原型1。

2、find_first_of成员函数:查找字符串中的任意字符首次出现的位置

1)、原型1:size_type find_first_of(const string& str, size_type pos=0)const;

意义:从原string对象中的位置pos处开始查找str字符串中任意字符首次出现的位置。

示例:string s1="01cba23456abc789"; string s2="thabkdc";

int n1=s1.find_first_of(s2);结果n1=2; //因为s1中的字符c是s2中的字符,他最早出现在位置2。

2)、原型2:size_type find_first_of(const char* c, size_type pos, size_type n)const;

意义:由字符数组c中的前n个字符组成子串,然后从原string对象中的位置pos处开始查找该子串中任意字符首次出现的位置。

示例:string s1="01cba23456abc789"; char c[]="thabkdc";

int n1=s1.find_first_of(c,0,4); 结果n1=3;//由c的前4个字符构成的子串是”thab”,在s1中字符b是该子

串的字符,而且是最先出现的,因此反回3

3)、原型3:size_type find_first_of(const char*c, size_type pos=0)const; //原型1的char字符数组版本,见原型1。

4)、原型4:size_type find_first_of(char c, size_type pos=0)const; //原型1的char单字符版本,原理同原型1。

3、find_last_of成员函数:查找字符串中的任意字符最后出现的位置

1)、原型1:size_type find_last_of(const string& str, size_type pos=npos)const;

意义:在原string对象的位置pos之前(包括pos)查找str字符串中任意字符最后一次出现的位置。

示例:string s1="01cba23456abc789"; string s2="thabkdc";

int n1=s1.find_last_of(s2); n1=12; //在s1之中最后一次出现s2中的字符位于7之前的c。

int n1=s1.find_last_of(s2,9); n1=4; //在s1的位置(即)最后一次出现s2中的字符位于2之前的a

int n1=s1.find_last_of(s2,10); n1=10; //在s1的位置10(即a)之前最后一次出现s2中的字符位于位置10(因为

包括位置10)

2)、原型2:size_type find_last_of(const char* c, size_type pos, size_type n)const;

意义:由字符数组c中的前n个字符构成子串,然后在原string对象的位置pos之前(包括pos)查找该子串中任意字符最后一次出现的位置。

示例:string s1="01cba23456abc789"; char c[]="thabkdc";

int n1=s1.find_last_of(c,14,3); n1=10; //由字符数组c的前3个字符组成的子串为”tha”;在s1中最后含有”

tha”中任意字符的位置位于6之后的a。

3)、原型3:size_type find_last_of(const char* c, size_type pos=npos)const; //原型1的char字符数组版本,详见原型1

4)、原型4:size_type find_last_of(char c, size_type pos=npos)const; //原型1的char单字符版本,详见原型1。

4、find_first_not_of成员函数:在原字符串中查找第一个不是目标字符串中任意字符的位置

1)、原型1:size_type find_first_not_of(const string& str, size_type pos=0)const;

意义:在原string对象中的位置pos处开始查找第一个不是str字符串中任意字符的位置。

示例:string s1="ababc123"; string s2="thabkdc";

int n1=s1.find_first_not_of(s2); n1=5; //数字1是最早出现的不是字符串s2中的字符。

2)、原型2:size_type find_first_not_of(const char* c, size_type pos, size_type n)const;

意义:由字符数组c的前n个字符构成子串,然后在原string对象中的位置pos处开始查找第一个不是该子串中任意字符的位置。

示例:string s1="ababc123"; char c[]="thabkdc";

int n1=s1.find_first_not_of(c,0,4); n1=4; //由字符数组c的前4个字符构成的子串是”thab”,在s1中的字符c

是第一个不是子串中的字符。

3)、原型3:size_type find_first_not_of(const char* c, size_type pos=0)const; //原型1的char字符数组版本,详见原型1

4)、原型4:size_type find_first_not_of(char c, size_type pos=0)const; //原型1的char单字符版本,详见原型1。

5、find_last_not_of成员函数:在原字符串中查找最后一个不是目标字符串中任意字符的位置

1)、原型1:size_type find_last_not_of(const string& str, size_type pos=npos)const;

意义:在原string对象的位置pos之前查找最后一个不是str字符串中任意字符的位置。

示例:string s1="ababc123ab45"; string s2="thabkdc";

java String类的用法

1 String 类的用法 public class SetStringValue { /** * @param args */ public static void main(String[] args) { String str1=new String("Java是当今最流行的编程语言之一");//截取数组 String str2="java是优秀的技术"; char[] szStr={'H','e','l','l','o',',','j','a','v','a'}; String str3=String.copyValueOf(szStr);//复制数组,所有数组。 String str4=String.copyValueOf(szStr,6,4);//所取数组,开始位置,所取个数 System.out.println(str1); System.out.println(str2); System.out.println(str3); System.out.println(str4); // TODO Auto-generated method stub } } 2 public class StringPool { /** * @param args */ public static void main(String[] args) { String str1="Good!"; String str2="Good!"; String str3=new String("Good!"); if(str1==str2)//判断地址是否相同 { System.out.println("str1=str2");//地址相同则输出相等

C++string类型总结

对C++中string类型的总结 string类对象的构造 简化构造函数原型如下(注意,为了简便,把模板中最后一个默认参数省略了): 1: explicit basic_string(); 2: string(const char *s); 3: string(const char *s, size_type n); 4: string(const string& str); 5: string(const string& str, size_type pos, size_type n); 6: string(size_type n, E c); 7: string(const_iterator first, const_iterator last); string对象的操作 字符串比较 支持六种关系运算符(==、!=、>、>=、<、<=),其采用字典排序策略(与C中字符串比较策略完全一样)。这六个关系运算符是非成员的重载运算符。而这些 运算符都支持三种操作数组合:string op string、string op const char*、cons t char* op string(其中op是前面六种关系运算符中任意一种)。解释:提供运算 符的三种重载版本主要是从效率角度考虑的,其避免了临时string对象的产生。 另外,string类还提供了各种重载版本的成员函数compare来比较,简化函数原型为: 1: int compare(const string& str) const; 2: int compare(size_type p0, size_type n0, const string& str); 3: int compare(size_type p0, size_type n0, const string& str, si ze_type pos, size_type n); 4: int compare(const char* s) const; 5: int compare(size_type p0, size_type n0, const char* s) const; 6: int compare(size_type p0, size_type n0, const char* s, size_t ype n) const; 返回值:如果调用该函数的对象的比较序列小于操作数比较序列,则返回负数; 若相等,则返回0;否则,返回正数。

C语言程序设计教程第一章练习题题目

单选题 1、下列语言中不属于计算机语言的三大类的是(C )。 A.机器语言 B.汇编语言 C.脚本语言 D.高级语言 2、下列说法中不正确的是(C ) A.计算机语言大致可分为三大类,即机器语言、汇编语言和高级语言 语言是一种通用的、过程式的编程语言,具有高效、灵活、可移植等优点 语言属于汇编语言 D.高级语言比汇编语言更贴近于人类使用的语言,易于理解、记忆和使用 3、以下开发工具中不属于主流的开发工具的是(B ) Studio ::Block 4、下列选项是对主流开发工具的介绍,其中错误的是(B ) Studio支持C/C++、C#、F#、VB等多种程序语言的开发和测试 ::Block是一个免费的跨平台IDE,支持C、C++和Fortan程序的开发 是一种被广泛使用的免费跨平台IDE,最初由IBM公司开发 是一款功能非常强大的IDE ( 和其他IDE不同的是,Vim本身并不是一个用于开发计算机程序的IDE,而是一款功能非常强大的文本编辑器,它是UNIX系统上Vi编辑器的升级版。) 5、下列选项中,不属于开发一个C语言应用程序的具体实现步骤的是(A ) A.启动开发工具 B.添加源文件 C.编写代码 D.运行程序 6、下列选项中,关于main()函数叙述不正确的是(C ) A.一个完整的C语言程序中,有且只能有一个main()函数 ()函数是程序的主入口,程序总是从main()函数开始执行 C.如果没有声明main()函数,程序将从第1行开始执行 ()函数可以有返回值,也可以没有返回值 7、下面程序中,合法的选项是(D ) A.#include int main() { printf("hello world\n"); return 0; } B.#include int man() { printf("hello world\n"); return 0; } C.#include int main() { printf("hello world\n") return 0; } D.#include int main() { print("hello world\n"); return 0; } 8、下面程序中,运行结果为“1,2”的是(A ) A.#include int main() { int a = 1; int b = 2; printf("%d %d\n",a,b); return 0; } B.#include int main() { int a = 1; int b = 2; printf("%d,"a); printf("%d\n",b); return 0; } C.#include int main() { int a = 1, b = 2; printf("%d,,%d\n",a,b); return 0; }

STRING类函数用法总结3

C++中的string类 前言:string的角色 1string使用 1.1充分使用string操作符 1.2眼花缭乱的string find函数 1.3string insert,replace,erase2string和C风格字符串 3string和Charactor Traits 4string建议 5小结 6附录前言:string的角色 C++语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触perl,php,和Shell脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。 举例来说,如果文本格式是:用户名电话号码,文件名name.txt Tom23245332 Jenny22231231 Heny22183942 Tom23245332 ... 现在我们需要对用户名排序,且只输出不同的姓名。 那么在shell编程中,可以这样用: awk'{print$1}'name.txt|sort|uniq 简单吧? 如果使用C/C++就麻烦了,他需要做以下工作: 先打开文件,检测文件是否打开,如果失败,则退出。 声明一个足够大得二维字符数组或者一个字符指针数组 读入一行到字符空间 然后分析一行的结构,找到空格,存入字符数组中。 关闭文件 写一个排序函数,或者使用写一个比较函数,使用qsort排序 遍历数组,比较是否有相同的,如果有,则要删除,copy... 输出信息 你可以用C++或者C语言去实现这个流程。如果一个人的主要工作就是处理这种

JAVA实验报告四(实现String类)

JA V A实验报告实验四运用JavaFx实现时钟动画 班级:计算机科学与技术1306 学号: 00 姓名:王雨思 指导教师:鲁鸣鸣 2014 年 12 月 1 日

目录 一.概述 (6) 二.总体方案设计 (7) 三.详细设计 (8) 四.程序的调试与运行结果说明 (9) 五.课程设计总结 (10) 六.后记 (11) 七.附录 (12) 参考文献 (13)

一概述 1.课程设计的目的 了解和掌握String类的实现原理 2.课程设计的要求 基于ArrayList实现可以深度复制(Deep Copy)的栈结构。1.首先用ArrayList实现栈结构 2.接着将第1步实现的栈通过Clonable接口实现深度复制 3.课程设计的主要设计思想 基于ArrayList实现可以深度复制(Deep Copy)的栈结构。二总体方案设计 编写程序实现MyString类的下列操作: public MyString(char[] chars); public char charAt(int index); public int length(); public MyString substring(int begin, int end); public MyString toLowerCase(); public boolean equals(MyString s); public static MyString valueOf(int i); public int compare(String s); public MyString substring(int begin); public MyString toUpperCase(); public char[] toChars();

(完整版)C语言程序设计教程第五章练习题题目

单选题 1、关于数组的定义与初始化,下列哪一项是错误的() A.int arr[5] = {1,2,3,4,5}; B.int arr[] = {1,2,3,4,5}; C.int arr[5] = {1,2,3}; D.int arr[5] = {1,2,3,4,5,6}; 2、在定义数组int arr[10]后,下列选项中对arr的引用正确的是() A.arr[10] B.arr[6.3] C.arr(6) D.arr[0] 3、在C语言中,引用数组元素时,其数组下标的数据类型允许是() A.整型常量 B.整型表达式 C.整型常量或整型表达式 D.任何类型的表达式 4、若int arr[5] = {1,2,3}; 则arr[2]的值为() A.1 B.2 C.3 D.null 5、在执行int arr[][3] = {1,2,3,4,5,6}:语句后,arr[1][0]的值为() A.4 B.1 C.2 D.5 6、关于二维数组,下列选项能正确定义并赋初值的是() A.int n = 5,b[n][n]; B.int a[1][2] = {{1},{3}}; C.int c[2][] = {{1,2},{3,4}}; D.int a[3][2] = {{1,2},{3,4}}; 7、阅读下列程序段: char s[18] = "a book!"; printf("%.4s\n", s); 其输出结果为() A.a book! B.a book C.a bo D.a 8、阅读下列程序: int a[4][4] = { { 1, 3, 5, }, { 2, 4, 6 }, { 3, 5, 7 } }; printf("%d%d%d%d\n", a[0][0], a[1][1], a[2][2], a[3][3]);

编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数

编写strcpy函数和类String的构造函数、析构函数、赋值函数和重载运算符函数 已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数strcpy char *strcpy(char *strDest, const char *strSrc); //将源字符串加const,表明其为输入参数 { assert((strDest!=NULL) && (strSrc !=NULL)); // 2分 //对源地址和目的地址加非0断言 char *address = strDest; // 2分//为了实现链式操作,将目的地址返回 while( (*strDest++ = * strSrc++) != …\0? ) // 2分 NULL ; return address ; // 2分 } (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值? 答:为了实现链式表达式。// 2分 例如int length = strlen( strcpy( strDest, “hello world”) ); 二、网上广泛流传的,也是摘自林锐的 http://www.blog.sh/user3/skyflowing/archives/2006/60452.html 题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。

C语言程序设计阅读程序题库及答案

阅读程序题 【2.1】以下程序的输出结果是。 main(D ) { float a; printf("%g",a); } A) 0.00000e+00 B) 0.0 C) 1.00000e-07 D) 0 【2.2】下面程序的输出结果是B____。 #include main( ) { int x=10; { int x=20; printf ("%d,", x); } printf("%d\n", x); } A) 10,20 B) 20,10 C) 10,10 D) 20,20 【2.3】以下程序的输出结果是___B_。 main()

{ unsigned int n; int i=-521; n=i; printf("n=%u\n",n); }//变量i中的负号传送给变量n后,因n是无符号数,已不作为负号处理。 【2.4】以下程序的输出结果是。 main(D ) { int x=10, y=10; printf("%d %d\n", x――, ――y); } A) 10 10 B) 9 9 C) 9 10 D) 10 9 【2.5】以下程序的输出结果是___B。 main() { int n=1; printf("%d %d %d\n",n,n++,n--); } // C语言在执行printf()时,对函数中的表达式表列的处理顺序是从后向前,即先处理n- -,再处理n++,最后处理n, A) 1 1 1 B) 1 0 1 C) 1 1 0 D) 1 2 1 【2.6】以下程序的输出结果是____。 main() { int x=0x02ff,y=0x0ff00;

string类的使用教程

这个是string类的使用教程,可以参考一下 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用= 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 好了,进入正题……… 首先,为了在我们的程序中使用string类型,我们必须包含头文件。如下:#include //注意这里不是string.h string.h是C字符串头文件 1.声明一个C++字符串 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下: a) string s; //生成一个空字符串s b) string s(str) //拷贝构造函数生成str的复制品 c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值 d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值 e) string s(cstr) //将C字符串作为s的初值 f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s 的初值。 g) string s(num,c) //生成一个字符串,包含num个c字符 h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 i) s.~string() //销毁所有字符,释放内存 都很简单,我就不解释了。 2.字符串操作函数 这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。 a) =,assign() //赋以新值 b) swap() //交换两个字符串的内容 c) +=,append(),push_back() //在尾部添加字符 d) insert() //插入字符 e) erase() //删除字符 f) clear() //删除全部字符 g) replace() //替换字符 h) + //串联字符串 i) ==,!=,<,<=,>,>=,compare() //比较字符串 j) size(),length() //返回字符数量

java对象转换String类型的三种方法

北大青鸟中关村 java对象转换String类型的三种方法在很多情况下我们都需要将一个对象转换为String类型。一般来说有三种方法可以实现:Object.toString()、(String)Object、String.valueOf(Object)。下面对这三种方法一一分析 一、采用Object.toString() toString方法是https://www.360docs.net/doc/1c5540702.html,ng.Object对象的一个public方法。在java中任何对象都会继承Object 对象,所以一般来说任何对象都可以调用toString这个方法。这是采用该种方法时,常派生类会覆盖Object里的toString()方法。 但是在使用该方法时要注意,必须保证Object不是null值,否则将抛出NullPointerException 异常。 二、采用(String)Object 该方法是一个标准的类型转换的方法,可以将Object转换为String。但是在使用该方法是要注意的是需要转换的类型必须是能够转换为String的,否则会出现CalssCastException异常错误。 代码代码如下: Object o = new Integer(100); String string = (String)o; 这段程序代码会出现https://www.360docs.net/doc/1c5540702.html,ng.ClassCastException: https://www.360docs.net/doc/1c5540702.html,ng.Integer cannot be cast to https://www.360docs.net/doc/1c5540702.html,ng.String。因为将Integer类型强制转换为String类型,无法通过。 三、String.valueOf(Object) 上面我们使用Object.toString()方法时需要担心null问题。但是使用该方法无需担心null值问题。因为在使用String.valueOf(Object)时,它会判断Object是否为空值,如果是,则返回null。下面为String.valueOf(Object)的源码: 代码代码如下: public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } 从上面我们可以看出两点:一是不需要担心null问题。二是它是以toString()方法为基础的。但是一定要注意:当object为null时,String.valueOf(object)的值是字符串对象:"null",而不是null!!!

《C语言程序设计》练习题

《C程序设计》练习题 一、单项选择题 导读:单项选择题要求从给出的四个备选答案中,选出一个最符合题意的答案。在完成习题的过程中,不但要选出正确的答案,而且要清楚不正确的选项错在何处,以加深对概念的理解。对于掌握不准的问题,应该通过上机实验来检验。(注:选用普通整型数据占用2个字节的c编译器。如Turbo C 2.0 、Win-TC、Turbo C++ 3.0) 【1.1】以下不正确的C语言标识符是____。 A) int B) a_1_2 C) ab1exe D) _x 【1.2】以下是正确的C语言标识符是____。 A) #define B) _123 C) %d D) \n 【1.3】下列四组字符串中都可以用作C语言程序标识符的一组是。 ??? A) print B) iam C) Pxq D) str_l ??? _3d one_half My->book Cpp ??? oodbs tart$it line# pow ??? aBc 3pai His.age while 【1.4】下面各选项组中,均是C语言关键字的组是。 A) auto,enum,include B) switch,typedef,continue C) signed,union,scanf D) if,struct,type 【1.5】下列不属于C语言关键字的是。A) default B) register C) enum D) external 【1.6】C语言程序从main()函数开始执行,所以这个函数要写在____。 A) 程序文件的开始B) 程序文件的最后 C) 它所调用的函数的前面D) 程序文件的任何位置 【1.7】下列关于C语言的叙述错误的是____ A) 大写字母和小写字母的意义相同 B) 不同类型的变量可以在一个表达式中 C) 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型 D) 同一个运算符号在不同的场合可以有不同的含义 【1.8】在C语言中,错误的int类型(长度为2字节)的常数是。 A) 32768 B) 0 C) 037 D) 0xAF 【1.9】执行语句printf("%x", -1); (int类型长度为2字节)屏幕显示____。 A) -1 B) 1 C) -ffff D) ffff 【1.10】已知long i=32768; 执行语句printf("%d", i); 屏幕显示____。 A) -1 B) -32768 C) 1 D) 32768 【1.11】已知long i=65539; 执行语句printf("%d", i); 屏幕显示____。 A) 65539 B) -3 C) 3 D) 程序不能执行 【1.12】在C语言中,整数-8在内存中的存储形式是。

C++ string类专题(修订版)

本文作者:黄邦勇帅(编著)(原名:黄勇) 本文是学习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 Allocator=allocator > class basic_string; 1)、charT是个类型模板形参,若实例化时传递char类型,则charT=char,传递wchar则charT=wchar 2)、traits是类型模板形参,描述了字符串的特征,比如字符串是否以’\0’作为结束尾等。traits要求传递一个 char_traits的模板类型作为实参。 3)、Allocator也是个类模板形参,他的主要作用是用于处理字符串的内存分配问题,默认使用new和delete分配内 存。Allocator要求传递一个allocator类型的模板类型作为实参。 4)、basic_string有两个特化体版本(重点),如下所示,当然我们也可以实例化其他类型版本的base_string类模板, ①、typedef base_string string; //即string类是使用typedef重命名后的basic_string类模板的char特化体版本。 ②、typedef base_string wstring; //主要用于处理宽字符串。 6、size_type类型(重要):size_type是basic_string类中定义的类型,一般被定义为unsigned类型。需要使用限定名的 方法来使用size_type类型,比如string::size_type a;或basic_string::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构造函数多了一个用于分配

【实验5】c++MyString类实现

ccnu_hupo_cpp_class_tst6exercise2_by:lele_2013_10_30 new不忘delete Design the string class in the C++ library by providing your own implementation for the following functions (name your class MyString): MyString();//构造 MyString(const char* cString);//地址不能变 char at(int index) const;//输入数组下标,返回字符 int length() const;//长度 void clear();//清空len=0 bool empty() const;//是否清空?len不变 int compare(const MyString& s) const;// int compare(int index, int n, const MyString& s) const; void copy(char s[], int index, int n); char* data() const; int find(char ch) const; int find(char ch, int index) const; int find(const MyString& s, int index) const; */ #include #include using namespace std; class MyString { public: MyString(); MyString(const char* cString); char at(int index) const;// int length() const; void clear(); bool empty() const; int compare(const MyString& s) const; int compare(int index, int n, const MyString& s) const; void copy(char s[], int index, int n); char* data() const; int find(char ch) const; int find(char ch, int index) const; int find(const MyString& s, int index) const; ~MyString()

C语言编程题练习

1.编程求出1000到3000之间能被7、11、17同时整除的整数的平均值,并输出(结果保留两位小数)。 2.用选择结构的嵌套实现:判断一个数是否同时是5和7的倍数 3.在给定的含n(不超过100)个整数的数组中查找某个数m,若找到则打印在数组中第几个元素,若 不在该数组中则打印“无此数”。 4.编程判断输入的正整数是否既是5又是7的整倍数。若是,输出yes,否则输出no。 5.歌唱比赛有10个评委,分别给出1~100分,除去一个最高分,再除去一个最低分,剩余8个人的给 分的平均值作为选手的最终得分。请编写该程序。 6.输入一个正整数n(1

Qt 的QString类的使用

Qt 的QString类的使用Qt的QString类提供了很方便的对字符串操作的接口。 1.使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替。 QString::fill ( QChar ch, int size = -1 ) 例: QString str = "Berlin"; str.fill('z'); // str == "zzzzzz" str.fill('A', 2); // str == "AA" 2,从字符串里查找相同的某个字符串str。 int QString::indexOf ( const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const 例如: QString x = "sticky question"; QString y = "sti"; x.indexOf(y); // returns 0 x.indexOf(y, 1); // returns 10 x.indexOf(y, 10); // returns 10 x.indexOf(y, 11); // returns -1 3指定位置插入字符串 QString & QString::insert ( int position, const QString & str ) 例如: QString str = "Meal"; str.insert(1, QString("ontr")); // str == "Montreal" 3,判断字符串是否为空。 bool QString::isEmpty () const 如: QString().isEmpty(); // returns true QString("").isEmpty(); // returns true QString("x").isEmpty(); // returns false QString("abc").isEmpty(); // returns false

各个类及其方法的实现

客户端:(六个类) ChatClient、Denglu、Hall、HUIQICC 、Panecc、Registry 功能: 1、ChatClient: * 该类主要关于客户端与服务器之间的通信,包括聊天信息、悔棋信息、认输信息、退出信息、注册信息、登陆信息等等* 通过该类还调用了大量的Panecc类的方法,实现通信信息在界面上的实现 * * 主要方法是Connect(),通过调用该方法建立与服务器端的连接,在该方法里,new了一个Thread对象, * 同时架设了经过初步包装基本的管道(DataInputStream和DataOutputStream)。接下来便开始接收服务器端 * 发来的消息了,通过简单的协议,实现不同种类消息的接收和解析,该协议便是一串数字(int类型), * 在发送消息方法里先写进一串数字,再写入需要发送的消息内容。同理,接收消息时先读取数字,再根据不同的数字 * 解析出不同的消息种类。 * 除了Connect()方法之外,还有很多信息的发送方法,比如

聊天信息(SendMessage(String message))、登陆信息(SendLogin(String name,String key)) * 、注册信息(SendZhuce(String name,String pass))、发送猜先信息(sendcai(int a))等等 2、Denglu: * 该类是客户端的主驱动类,在该类中声明并初始化了ChatClient类的对象cc, * 并通过该对象调用了ChatClient类的许多方法; * 该类主要是关于登陆界面,并实现了相关监听; * 该类还存在一个内部类--paneLogin ,这个内部类主要是画界面,监听功能在主类中实现 * * 通过该类,将用户信息,发送给服务器,再由服务器连接数据库,判断登陆的相关信息。 3、Hall: * 该类是关于登陆大厅,存在一个内部类--hallt,该内部类

C语言程序设计-----阅读程序题库及答案

C语言程序设计-----阅读程序题库及答案 集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-

阅读程序题 【】以下程序的输出结果是。 main(D ) { float a; printf("%g",a); } A) +00 B) C) D) 0 【】下面程序的输出结果是B____。 #include <> main( ) { int x=10; { int x=20; printf ("%d,", x);

} printf("%d\n", x); } A) 10,20 B) 20,10 C) 10,10 D) 20,20 【】以下程序的输出结果是___B_。 main() { unsigned int n; int i=-521; n=i; printf("n=%u\n",n); }s",s); } A) a book! B) a book!<四个空格》 C) a bo D) 格式描述错误,输出不确定

【】下面程序的输出结果是____。 main() { int a,b; scanf("%2d%3d",&a,&b); printf("a=%d b=%d\n",a,b); } A) a=12 b=34 B) a=123 b=45 C) a=12 b=345 D) 语句右错误 【】以下程序段的输出结果是。 int a=10,b=50,c=30; if(a>b) a=b; b=c; c=a; printf("a=%d b=%d c=%d\n",a,b,c);

A) a=10 b=50 c=10 B) a=10 b=30 c=10 C) a=50 b=30 c=10 D) a=50 b=30 c=50 【】以下程序的输出结果是。 main() { int a=0,b=1,c=0,d=20; if(a) d=d-10; else if(!b) if(!c) d=15; else d=25; printf("d=%d\n",d); } A) d=10 B) d=15 C) d=20 D) d=25 【】下面程序的输出结果为。 main()

java 字符串常用函数及其用法

java中的字符串也是一连串的字符。但是与许多其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理。将字符串作为内置的对象处理允许Java提供十分丰富的功能特性以方便处理字符串。下面是一些使用频率比较高的函数及其相关说明。 String相关函数 1)substring() 它有两种形式,第一种是:String substring(int startIndex) 第二种是:String substring(int startIndex,int endIndex) 2)concat() 连接两个字符串 例:String s="Welcome to "; String t=s.concat("AnHui"); 3)replace() 替换 它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下: String replace(char original,char replacement) 例如:String s=”Hello”.replace(’l',’w'); 第二种形式是用一个字符序列替换另一个字符序列,形式如下: String replace(CharSequence original,CharSequence replacement) 4)trim() 去掉起始和结尾的空格 5)valueOf() 转换为字符串 6)toLowerCase() 转换为小写 7)toUpperCase() 转换为大写 8)length() 取得字符串的长度 例:char chars[]={’a',’b’.’c'}; String s=new String(chars); int len=s.length(); 9)charAt() 截取一个字符 例:char ch; ch=”abc”.charAt(1); 返回值为’b’ 10)getChars() 截取多个字符 void getChars(int sourceStart,int sourceEnd,char target[],int targetStart) sourceStart 指定了子串开始字符的下标 sourceEnd 指定了子串结束后的下一个字符的下标。因此,子串包含从sourceStart到sourceEnd-1的字符。

相关文档
最新文档