C++标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。标准库string类型的目的就是满足对字符串的一般应用。
本文地址:http://www.cnblogs.com/archimedes/p/cpp-string.html,转载请注明源地址。
引入头文件#include<string>
1、string对象的定义和初始化
string标准库支持几个构造函数,构造函数是一个特殊成员函数
一下是几种初试化string对象的方式
string s1; //默认构造函数,s1为空串 string s2(s1); //将s2初始化为s1的副本 string s3("value"); //将s3初始化为一个字符串字面值副本 string s4(n,'c'); //将s4初始化字符'c'的n个副本
构造string对象的其他方法:
举例如下:
#include<iostream> #include<string> using namespace std; int main() { char *cp="Hiya"; char carray[]="World!!!!"; char nonull[]={'H','i'}; string s1(cp); //s1=="Hiya" string s2(carray,5); //s2=="World" string s3(carray+5,4); //s3=="!!!!" string s4(nonull); //error string s5(carray,2); //s5=="Hi" cout<<s1<<endl; cout<<s2<<endl; cout<<s3<<endl; cout<<s4<<endl; cout<<s5<<endl; cin.get(); return 0; }
注:s4的定义是错误的,调用这种形式的初始化,其参数必须是以空字符结束的数组,将不包含null的数组传递给此构造函数将导致编译器无法检测的严重错误
2、string对象的读写
使用标准输入输出操作符来读写string对象:
#include<iostream> #include<string> using namespace std; int main() { string s; cin>>s; cout<<s<<endl; return 0; }
string类型的输入输出操作符:
- 读取并忽略开头所有的空白字符(如空格、换行符、制表符等)
- 读取字符直至再次遇到空白字符,读取终止
我们可以把多个读操作或多个写操作放在一起:
string s1,s2; cin>>s1>>s2; cout<<s1<<s2<<endl;
(1)读入未知数目的的string对象
string的输入输出操作符也会返回所读的数据流,可以把输入操作作为判断条件:
int main() { string word; while(cin>>word) cout<<word<<endl; return 0; }
(2)、使用getline读取整行文本
string IO操作:getline,这个函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取内容到string中,但不包括换行符。getline并不忽略换行符,遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回,这时string参数将被置为空string
int main() { string line; while(getline(cin,line)) cout<<line<<endl; return 0; }
3、string对象的操作
(1)string的size和empty操作
了解string对象是否为空是有用的:
string st("test"); if(st.size()==0) //or if(st.empty())
(2)string::size_type类型
size()成员函数返回的是string::size_type类型的值,一种unsigned型,事实表明size_type存储的string长度是int所能存储的两倍
4、string对象的赋值
可以把一个string对象赋值给另一个string对象:
string s1,s2="test"; s1=s2;
先将s1占用的相关内存释放,分配给s1足够存放s2副本的内存空间,最后把s2中所有字符复制到新分配的内存空间
5、两个string对象相加
两个或多个string对象可以通过使用+或者+=连接起来
string s1("hello, "); string s2("word\n"); string s3=s1+s2; //or s1+=s2;
6、和字符串字面值的连接
string s1("hello"); string s2("world"); string s3=s1+", "+s2+"\n";
7、从string对象获取字符
string类型通过下标操作符([])来访问string对象中的单个字符
8、string对象的容器特征
string类型还支持大多数顺序容器的操作,在某些方面,可将string类型视为字符容器。除了一些特殊操作,string类型提供与vector容器相同的操作
不同的是:它不支持以栈的方式操纵容器:在string类型中不能使用front、back和pop_back操作
string类型提供的操作意味着可将操纵vector对象的程序改为操纵string对象:
#include<iostream> #include<string> using namespace std; int main() { string s("Hello!"); string::iterator iter=s.begin(); while(iter!=s.end()) cout<<*iter++<<endl; cin.get(); return 0; }
与容器共有的string操作
string类型特有的版本
9、只适用于string类型的操作
string类型提供了容器类型不支持的其他几种操作:
1、substr操作
s.substr(pos,n) //返回一个string类型的字符串,它包含s中从下标pos开始的n个字符
s.substr(pos) //返回一个string类型的字符串,它包含从下标pos开始到s末尾的所有字符
s.substr() //返回s的副本
#include<iostream> #include<string> using namespace std; int main() { string s("hello world"); string s2=s.substr(6,5); string s3=s.substr(6); cout<<s2<<endl; cout<<s3<<endl; cin.get(); return 0; }
2、append和replace函数
对于append操作,字符将添加在string对象的末尾,而replace函数则将这些字符插入到指定位置,从而替换string对象中一段已存在的字符
修改string对象的操作:
append和replace操作的参数:args