string是C++编程语言中的字符串。在C++中字符串处理可以使用c语言字符串形式char *,也可以使用string类格式。
string 是一个类,类内有char *指针,通过容器方式管理字符串。使用string类型需要需要包含头文件string。
string类提供了多种构造函数,支持无参构造、有参构造、拷贝构造。
无参构造:string()
有参构造:string(const char *str);
拷贝构造:string(const string &str);
初始化字符串为count个c字符:string(int count,char c);
#include < iostream >
#include < string >
using namespace std;
void test()
{
string s1;//默认构造,即无参构造函数
char const* str = "hello,world";//c语言字符串
string s2(str);//传入C语言字符串
cout << "s2=" << s2 << endl;
string类中提供"="运算符重载和assign()全局函数进行赋值操。这两种方式均有多个重载版本,如下所示:
string字符串赋值:
string &operator=(const char *s);//将c字符串赋给string
string &operator=(const string &s);//将s赋值给string
string &operator=(char c);//将字符c赋给string
全局函数:
string &assign(const char *s);//将c字符串赋给string
string &assign(const char *s,int n);//将c字符串前n个赋给string
string &assign(const string &s);//将s赋给string
string &assign(int n,char c);//将n个c赋给string
#include < iostream >
using namespace std;
#include < string >
void test()
{
string s1="hello,world";//c语言字符串赋值
cout << "s1=" << s1 << endl;
string s2 = s1;//将s1赋给s2
cout << "s2=" << s2 << endl;
string s3 ;//单个字符赋给string
s3 = 'c';
cout <<"s3="<< s3 << endl;
//全局函数赋值
s1=assign("c++赋值测试");
cout<<"s1="<<s1<<endl;
s2=assign(s1,5);//将s1的前5个字符赋给s2
s3=assign(s1);//将s1赋给s3
string s4=assign(10,'a');
string类中字符串拼接有重载"+="运算和全局函数append方式,均有多种重载版本。
运算符重载
string &operator+=(const char *s);将s追加到string
string &operator+=(const string &str);//将str追加到string
string &operator+=(const char c);//将字符c追加到string
全局函数append
string &append(const char *s);//将s追加到string
string &append(const char *s,int n);//将s的前n个追加到string
string &append(const string &str);//等价于operator+=(const string &str)
string &append(const string &str,int pos,int n); --从str的第pos位置开始,取出n个字符追加到string中
void test()
{
//+=运算符重载示例
string s1 = "C++";
s1 += "学习";
s1 += ',';
cout << "s1=" << s1 << endl;
string s2 = "学习使我快乐!";
s1 += s2;
cout << "s1=" << s1 << endl;
//append示例
string s3;
s3 = "C++";
s3.append("学习");
s3.append(s2,4);//从s2的第4个字符开始,将s2的字符拼接到s3
cout << "s3=" << s3 << endl;
s3.append(s2, 4,4);
cout < < "s3=" << s3 << endl;//从s2的第4个字符开始,将s2的接下来4个字符拼接到s3
s3.append("月入过万!");
cout < < "s3=" < < s3 << endl;
s3.append("我的未来不是梦",4,10);//从第4个位置开始截取10个字符拼接到s3
cout < < "s3=" << s3 << endl;
}
int main()
{
test();
system("pause");
}
string字符串查找有find、rfind函数。
//find函数:从左往右查找
返回值:查找成功返回出现的位置,失败返回-1
int find(const string&str,int pos=0)const;//形参pos表示开始查找的起始位置
int find(const char *str,int pos=0)const;
int find(const char *str,int pos=0,int n)const;//从str的第pos开始的前n个字符中str出现的位置
int find(const char c,int pos=0);//查找字符c
//rfind函数:从右往左查找
int rfind(const string &str,int pos=npos);从pos位置开始查找str最后一次出现的位置
int rfind(const char *str,int pos=npos);从pos位置开始查找str最后一次出现的位置
int rfind(const char *str,int pos=pos,int n);从pos开始的前n个字符中str最后一次出现的位置
int rfind(const char c,int pos=0);//查找c最后一次出现的位置
//字符串替换
string &replace(int pos,int n,const string &s);//将字符串的第pos位置开始的n个字符替换成s
string &replace(int pos,int n,const char *s);
#include < iostream >
#include < string >
using namespace std;
void test()
{
string str = "1asd3as456asd4789asd";
int pos = str.find("asd");//查找asd第一次出现的位置
cout << "pos=" << pos << endl;
string temp = "asd";
pos = str.find(temp,7);//从第7个位置开始查找asd出现的位置
cout << "pos=" << pos << endl;
pos = str.rfind(temp);//查找最后一次出现的位置
cout << "pos=" << pos < < endl;
pos = str.rfind("asd",7,2);//从第3个位置开始往前查找,查找"asd"中的前2个字符在str中最后一次位置
cout << "pos=" << pos << endl;
//字符串替换
str.replace(1, 7, "c++");//从第一个位值开始将str的7个字符替换为c++
cout << "str=" << str << endl;
}
int main()
{
test();
system("pause");
}
string类中字符串比较函compare数有多个重载版本,既可以和C语言风格const char *字符串进行比较,也可以和string类字符串进行比较。相等返回0,不相等返回!0值。
字符串比较:
int compare(const char *str);//相等返回0,否则返回非0值
//比较string的len个字符,从idx位置开始
int string::compare (size_type idx, size_type len, const string& str) const
//从指定位置指定长度开始比较
int string::compare (size_type idx, size_type len, const string&str, size_type str_idx, size_type str_len) const
#include < iostream >
using namespace std;
#include < string >
void test()
{
string str1 = "hello,world";
if (str1 == "hello,world")
{
cout << "[const char *]相等" << endl;
}
string str2 = "hello,world";
if (str1 == str2)
{
cout << "[string]相等" << endl;
}
if (!str1.compare("hello,world"))
{
cout << "[compare]相等" << endl;
}
//比较str1的前6个字符
int ret=str1.compare(0,6,"hello,");
cout << "ret=" << ret << endl;
//从str1的第0个开始开始取出6个字符,
//从"c++,hello,"的第4个位置开始,取出6个字符进行比较
ret = str1.compare(0, 6, "c++,hello,", 4, 6);
cout << "ret=" << ret << endl;
}
int main()
{
test();
system("pause");
}
string类字符串使用字符方式访问,可以使用重载"[]"版本函数,即可以和C语言中访问方式一样,也可以使用函数at来访问。
string类中对于字符串的长度获取,可以使用size()函数或者length()函数来实现。
string以字符方式访问
char &operator[](int n);
char &at(int n);
string 中获取字符串长度
str.size();
str.length();
#include < iostream >
#include < string >
using namespace std;
void test()
{
string str = "hello,world";
cout << "str长度:" << str.size() << endl;
cout << "str长度:" << str.length() << endl;
//修改成员
for (int i = 0; i < str.size(); i++)
{
str[i] = i+'0';
}
//遍历
for (int i = 0; i < str.size(); i++)
{
cout << str.at(i) << " ";
}
cout << endl;
}
int main()
{
test();
system("pause");
}
string类中插入函数insert支持多种插入方式,有多个重载版本。
字符串删除可以使用erease函数实现。
c++插入:
string& insert(int pos,const char *s);//从第pos位置开始插入s
string& insert(int pos,const string &s);
string &insert(int p0, const char *s, int n);//从p0位置开始插入s,插入的s连续n个字符
string &insert(int p0,const string &s, int pos, int n);//从p0位置开始插入s,插入的s从pos开始,连续n个字符
string &insert(int p0, int n, char c);//从p0处插入n个字符c
c++删除字符串
string &erase(int pos,int n=npos);//从pos位置开始删除n个字符
#include < iostream >
#include < string >
using namespace std;
void test()
{
string str = "hello,";
str.insert(2,"aaa");//从第2个位置开始插入aaa
cout < < "str=" << str << endl;
str.insert(4, "1234", 1, 2);//从第4个位置插入,从"1234"的第1个位置开始,连续两个字符插入到str中
cout << "str=" << str << endl;
//字符串删除
str.erase(2,4);//从第2个位置开始,删除4个字符
cout << "str=" << str << endl;
str.erase();//清空字符串
cout < < "str=" << str <<"\t长度:"<< str.size()<<endl;
string类中对于子字符串的提取,可以使用函数substr实现。
判断string类字符串是否为空,即长度是否为0可以使用empty函数实现。
//子字符串提取
string substr(int pos=0,int n=npos)const;//从pos位置提取n个子字符
//判断字符串是否为空
bool empty();
#include
#include
using namespace std;
void test()
{
string str="123456asd12";
string temp=str.substr(6,3);//从下标6位置提取3个字符
cout<<"temp="<<temp<<endl;
string str2;
if(str2.empty())
{
cout<<"字符串为NULL"<<endl;
}
else
{
cout<<"字符串不为NULL"<<endl;
}
if(str2=="")
{
cout<<"字符串为NULL"<<endl;
}
}
int main()
{
test();
system("pause");
}
将string字符串转换为char *字符串,可以使用c_str函数实现。
const char *c_str();
const char *data();
在c11版本之后,这两个函数功能一致,都是将string类型字符串转换成char *,返回一个char *字符串,以'\0'结尾。
#include < iostream >
#include < string >
using namespace std;
int main()
{
string str = "hello,world";
const char* p = str.c_str();
cout << "p=" < < p << endl;
p = str.data();
cout << "p=" << p << endl;
system("pause");
}