用字符数组处理字符串时,常常会发生数组越界的问题。因此C++标准模板库中设计了“string”数据类型,专门处理字符串。string 类型的变量就是专门用来处理字符串 的,也叫“string”对象。string类型并不是C++语言的基本数据类型,而是c++ 标准模板库中的一个“类”。
在C++编程时,优先考虑使用string对象来处理字符串,因为其用法比字符数组更简单,而且不易出错。
定义string对象和其他数据类型没有什么不同:
string 变量名;
而且定义的时候还可以初始化,例如:
string str1;
string city="beijing";
定义string对象时,如果不对它进行初始化,那么它的值为空,即” “。
与字符数组不同的是一个string 对象的体积,大小是固定的,即表达式”sizeof(string)"的值是固定的,和其中存放的字符串的长度无关。但是这个固定的值在不同编译器上是不同的。string 对象并不会直接存放字符串,而是会在别的地方开辟空间存放,string对象只存放该内存空间的地址,或者再加上其他信息。
还可以定义string对象数组,例如:
string as[]={"beijing","shanghai","chengdu"};
cout<<as[1];//输出上海。
string对象可以用cin 和cout进行输入和输出,例如:
string s1,s2;
cin>>s1>>s2;
cout<
cin读入时会忽略开头的制表符、换行符以及空格,当遇到空格或者换行符就停止(不会读入空字符)
#include
#include
#include
using namespace std;
int main(){
string str;
int tot;
while (cin>>str)
{
cout<<++tot<<" "<<str<<endl;
}
return 0;
}
string 对象可以相互赋值,也可以用字符串常量和字符数组的名字对string对象进行赋值。赋值时不需要考虑被赋值对象是否有足够的空间存放。例如:
string s1,s2="OK";
s1="china";
s2=s1;//s1和s2 不等长也没关系,赋值后s2的内容和s1一样。
char name[]="lily";
s1=name;
用普通字符串对string对象进行赋值,普通字符串的内容会被复制到string对象所管理的那片内存空间去。
string对象之间可以“<",">","<=","==",">=",运算符进行比较,还可以用”+"运算符将连个string 对象进行相加,或者将一个字符串常量和string对象相加,将一个字符数组和string对象相加,相当于做字符串连接。“+=”运算符也适用于string对象。此外,string对象还可以通过“[]"运算符和下标,存取字符串中的某个字符。例如:
string s1="123",s2="abc",s3;
s3=s1+s2;//s3变成"123abc"
s3+="de";//s3变成"123abcde"
bool b=s1<s3;//b为r=true
char c=s1[2];//c变成'3'
s1[2]='5';s1变成"125"
string对象比较大小时,是按照字典顺序比较的,而且是大小写相关的。由于大写字母的ASCll码小于小写字母的ASCll码。所以“Zbc"比"abc"小。
string对象还有一些成员函数,可以方便的实现一些功能。如查找子串等,这些成员函数的调用方法就是”string“对象名。
#include
#include //使用string对象必须包含的头文件
using namespace std;
int main(){
string s1="123",s2;
s2+=s1;
s1="abc";
s1+="def";
cout<<"1)"<<s1<<endl;
if(s2<s1){
cout<<"2)s2<<endl;
}
else {
cout <<"2)s2>=s1"<<endl;
}
s2[1]='A';
s1="XYZ"+s2;
string s3=s1+s2;
cout <<"3)"<<s3<<endl;
cout<<"4)"<<s3.size() <<endl;//求s3的长度,输出4)9
string s4=s3.substr(1,3);//求从下标1开始,长度为3 的子串。
cout<<"5)" <<s4<<endl;
char str[20];
strcpy(str,s4.c_str());//复制s4中的字符串到str
cout<<"6)"<<str<<endl;
return 0;
}