C++中的string类型

简介

 C语言对字符串的处理是比较麻烦的,用字符数组的形式来实现,这就使得字符串的输入输出、比较等操作非常僵硬。在C++、Java、C#等语言中都使用到了string这一类型来处理字符串,其特点大同小异。

 在C++中,string严格来说并不是一种传统的数据类型,而是一个类,因此它具有和类相同的操作,可以通过在头文件中包含”cstring”来使用这个类。在创建一个string类对象时需要调用构造函数,在程序结束销毁它时需要调用析构函数,string类字符串进行操作实际上就是调用各种成员函数。

初始化

 实例化一个string类变量并赋初值,实际上就是调用构造函数。

缺省参数
1
string s; // s为一个空串

传入一个参数
1
2
string s1("Hello");     // 直接用常字符串来初始化s1
string s2(string str); // 用另一个字符串来初始化新字符串
传入两个参数
1
2
3
string s(int n, char c);   // s = cccc··ccc; 共n个c
string s(string str, int first); // 截取string型变量str中从first开始的后续所有字符作为新串,first从0开始取
string s(char str[], int length); // 截取char型字符数组str前length个字符作为新串
传入三个参数
1
string s(string str, int first, int length); // 截取str中从first位置开始的length个字符作为一个新串,first从0开始取

 此外还可以使用成员函数assign()完成赋值操作。以下用例来自@samkieth

1
2
3
4
5
6
s.assign(str); 
s.assign("Hi");
s.assign(5,'x'); //把五个x赋给字符串
s.assign("nico", 5); //把'n' ‘I' ‘c' ‘o' ‘/0'赋给字符串
s.assign(str, 1, 3); // 如果str是”iamangel” 就是把”ama”赋给字符串
s.assign(str, 2, string::npos); //把字符串str从索引值2开始到结尾赋给s

【注】npos是一个静态成员常量,它表示size_t类型的元素的理论最大值。定义为:

1
static const size_t npos = -1;

之所以将其值定义为-1,是由于size_t型变量是无符号的整型,-1就是这种类型的最大可表示数。当它在string的成员函数中作为一个长度参数使用时,意为“一直到字符串尾”。当它作为一个返回值使用时,通常意味着“无匹配”,参见以下find函数的使用。

常用操作和其他成员函数

符号运算

加法运算

 “+”在string类型中可以起到字符串与字符、字符串与char型字符数组、字符串与字符串之间的拼接作用:

1
2
3
string s1 = "I ";
s1 += "am ";
cout << s1 + 'a' + " boy." << endl; // 输出:I am a boy.

 使用成员函数append()可以实现相同的操作。

1
append  vt. 附加;添加;签名

比较运算

 string类型字符串灵活的将字符串和字符操作与运算符号相结合,字符串之间的比较不必像C语言中的那样需要调用strcmp(),通过’<’,’>’,’<=’,’>=’,’==’就可以完成。比较的原理和结果与调用strcmp()相同。

1
2
string s1 = "abc", s2 = "Abc";
cout << (s1 > s2) << endl; // 输出1,s1>s2

 此外,string类的成员函数compare()也能够提供比较功能。而且,compare()能够结合索引提供更加强大的比较功能,比如实现截取字符串特定子串进行比较。

1
2
3
string s1 = "abc", s2 = "Abc";
cout << s1.compare(s2) << endl; // 输出1,表示s1>s2
cout << s1.compare(1, 2, s2, 1, 2) << endl; // 将s1的1到2位置(即"bc")与s2的1到2位置(即"bc")比较,输出0,表示相等

其他成员函数

size()/length()——获取字符串长度

 使用size()和length()来获取字符串长度,这两个函数没有本质区别。

1
2
string str("Hello");
cout << str.size() << endl << str.length() << endl; // 两个输出都是5

empty——字符串判空

 改函数返回一个bool值,为1则空,为0则非空。

1
2
string s1, s2 = "Hi";
cout << s1.empty() << endl << s2.empty() << endl;

swap()——交换字符串内容

1
2
3
string s1 = "Hi", s2 = "Hello";
s2.swap(s1);
cout << s1 << " " << s2 << endl; // s1 = "Hello", s2 = "Hi"

insert()——插入字符串

1
2
3
string s1 = "Iamaboy";
s1.insert(1, " ").insert(4, " ").insert(6, " ").append(".");
cout << s1 << endl; // 输出:I am a boy.

 要注意的是,insert()不支持插入字符,如果要插入字符,要用双引号来以字符串的形式实现。

replac()——字符换替换

 同其他string类成员函数一样,replace也有很多重载函数,其中常用的一种原型为:

1
string &replace(int first, int length, const string &s);

其中,第三个参数也可以换成字符数组const char *s。

1
2
string s1 = "I, a boy.";                   // 替换前:I, a boy.
cout << s1.replace(1, 1, " am") << endl; // 替换后: I am a boy.

begin()和end()——返回指向字符串首尾的指针

1
2
3
string s1 = "Hello";    
cout << *s1.begin() << endl; // H
cout << *s1.end() << endl; // o

erase()——删除字符串

1
2
3
4
5
string s1 = "Hi, Jack!";
cout << s1.erase(2, 7) << endl; // 删除2到7位置字符,得到:Hi!
// or
s1.erase(s1.begin()+2, s1.end()-1); // 删除','~'k'之间所有字符,得到Hi!
cout << s1 << endl;

find()——字符串查询

 find函数的两个基本原型如下:

1
2
3
4
size_t find(const string& str, size-t pos) const;
//从pos位置开始,找到首个与str匹配的字符串的首字符下标
size_t find(const string& str, size_t pos, size_t length) const;
//从pos开始,在主串中找到首个与str前length个字符匹配的字符串的首字符下标

 值得一提的是,find函数同样可以用于在string类型变量中查找字符数组方式定义的字符串以及查找单个字符,在上面的函数原型中直接将string型变量替换成相应字符或字符数组即可。

 当查找失败时,find会返回size_t型变量的最大值,我们可以通过将string::npos与其比较获取匹配结果:

1
2
3
string s1 = "abc";
if(string::npos == s1.find('d'))
cout << "No match!" << endl;

 以上就是有关string类型的简单介绍,有关string的系统介绍请参考:@cplusplus.com


转载请注明来源:©Tinshine