简介
C语言对字符串的处理是比较麻烦的,用字符数组的形式来实现,这就使得字符串的输入输出、比较等操作非常僵硬。在C++、Java、C#等语言中都使用到了string这一类型来处理字符串,其特点大同小异。
在C++中,string严格来说并不是一种传统的数据类型,而是一个类,因此它具有和类相同的操作,可以通过在头文件中包含”cstring”来使用这个类。在创建一个string类对象时需要调用构造函数,在程序结束销毁它时需要调用析构函数,string类字符串进行操作实际上就是调用各种成员函数。
初始化
实例化一个string类变量并赋初值,实际上就是调用构造函数。1
string s; // s为一个空串
1 | string s1("Hello"); // 直接用常字符串来初始化s1 |
1 | string s(int n, char c); // s = cccc··ccc; 共n个c |
1 | string s(string str, int first, int length); // 截取str中从first位置开始的length个字符作为一个新串,first从0开始取 |
此外还可以使用成员函数assign()完成赋值操作。以下用例来自@samkieth:1
2
3
4
5
6s.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 | string s1 = "I "; |
使用成员函数append()可以实现相同的操作。1
append vt. 附加;添加;签名
比较运算
string类型字符串灵活的将字符串和字符操作与运算符号相结合,字符串之间的比较不必像C语言中的那样需要调用strcmp(),通过’<’,’>’,’<=’,’>=’,’==’就可以完成。比较的原理和结果与调用strcmp()相同。
1 | string s1 = "abc", s2 = "Abc"; |
此外,string类的成员函数compare()也能够提供比较功能。而且,compare()能够结合索引提供更加强大的比较功能,比如实现截取字符串特定子串进行比较。1
2
3string 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
2string str("Hello");
cout << str.size() << endl << str.length() << endl; // 两个输出都是5
empty——字符串判空
改函数返回一个bool值,为1则空,为0则非空。1
2string s1, s2 = "Hi";
cout << s1.empty() << endl << s2.empty() << endl;
swap()——交换字符串内容
1 | string s1 = "Hi", s2 = "Hello"; |
insert()——插入字符串
1 | string s1 = "Iamaboy"; |
要注意的是,insert()不支持插入字符,如果要插入字符,要用双引号来以字符串的形式实现。
replac()——字符换替换
同其他string类成员函数一样,replace也有很多重载函数,其中常用的一种原型为:1
string &replace(int first, int length, const string &s);
其中,第三个参数也可以换成字符数组const char *s。1
2string s1 = "I, a boy."; // 替换前:I, a boy.
cout << s1.replace(1, 1, " am") << endl; // 替换后: I am a boy.
begin()和end()——返回指向字符串首尾的指针
1 | string s1 = "Hello"; |
erase()——删除字符串
1 | string s1 = "Hi, Jack!"; |
find()——字符串查询
find函数的两个基本原型如下:1
2
3
4size_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
3string s1 = "abc";
if(string::npos == s1.find('d'))
cout << "No match!" << endl;
以上就是有关string类型的简单介绍,有关string的系统介绍请参考:@cplusplus.com。
转载请注明来源:©Tinshine