c++学习--string类详解

1.构造函数

string类有多个构造函数,具体如下:
1.string s1(“Hello”); //s1=“Hello”
2.string s2 = “March”; //s2=“March”
3. string s3(4,’x’); //s3=“xxxx”
4. string s4(“12345”,1,3);//s4=“234”

错误的初始化方法:
string error1 = ‘c’; // 错
string error2(‘u’); // 错
string error3 = 22; // 错
string error4(8); // 错

2. string对象赋值

  1. 用 = 赋值
    string s1(“cat”), s2;
    s2 = s1;
    s2=‘K’ //s2=“k”,可以将字符赋值给string对象

  2. 用 assign 成员函数复制
    string s1(“cat”), s3;
    s3.assign(s1);
    s3.assign(s1, 1, 2)==s3=s1.substr(1,2); //从s1 中下标为1的字符开始复制2个字符给s3
    s3.assign(4,‘k’); //s3=‘kkkk’

  3. 单个字符复制
    s2[5] = s1[5] ;

  4. 逐个访问string对象中的字符

string s1("Hello");
for(int i=0;i<s1.length();i++)
    cout << s1.at(i) << endl;

成员函数at会做范围检查,如果超出范围,会抛出
out_of_range异常,而下标运算符[]不做范围检查。

  1. string 支持流读取运算符
    string stringObject;
    cin >> stringObject; //==scanf(“%s”,s1)
  2. string 支持getline函数
    string s;
    getline(cin ,s); //==gets(s1);

3. string的连接

  1. 用 + 运算符连接字符串
    string s1("good "), s2("morning! ");
    s1 += s2;//s1==goodmorning!
  2. 用成员函数 append 连接字符串
    string s1("good "), s2("morning! ");
    s1.append(s2); //s1==goodmorning!
    s2.append(s1, 3, s1.size());// 下标为3开始,s1.size()个字符,如果字符串内没有足够字符,则复制到字符串最后一个字符
    s1.append(3,‘k’);

4.string对象的比较

  1. 关系运算符比较string的大小
    == , >, >=, <, <=, !=
    返回值都是bool类型,成立返回true, 否则返回false
    例如:
    string s1(“hello”),s2(“hello”),s3(“hell”);
    bool b = (s1 == s2); //b==true
    b = (s1 == s3); //b=false
    b = (s1 > s3); //b=true
  2. 用成员函数compare比较string的大小
    compare成员函数有以下返回值:小于0表示当前字符串小;等于0表示两个字符串相等;大于0表示当前字符串大
string s1("hello"),s2("hello"),s3("hell");
int f1 = s1.compare(s2);//比较s1与S2,f1==0
int f2 = s1.compare(1,2,s3,0,3); //s1的1-2与s3的0-3,f2==-1,el<hell
int f3 = s1.compare(0,s1.size(),s3);//hello>hell

5.交换两个string对象的内容

string s1("hello world"), s2("really");
s1.swap(s2);

6.查找子串和字符

  1. 成员函数 find()
string s1("hello world");
s1.find("lo");
s1.find("lo",1);//从下标1开始查找

在s1中从前向后查找 “lo” 第一次出现的地方,如果找到,返回 “lo”开始的位置,即 l 所在的位置下标。如果找不到,返回string::npos (string中定义的静态常量)

  1. 成员函数 rfind()
string s1("hello world");
s1.rfind("lo");

在s1中从后向前查找 “lo” 第一次出现的地方,如果找到,返回 “lo”开始的位置,即 l 所在的位置下标。如果找不到,返回string::npos

  1. 成员函数 find_first_of()
string s1("hello world");
s1.find_first_of(“abcd");

在s1中从前向后查找 “abcd” 中任何一个字符第一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos

  1. 成员函数 find_last_of()
string s1("hello world");
s1.find_last_of(“abcd");

在s1中查找 “abcd” 中任何一个字符最后一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos

  1. 成员函数 find_first_not_of()
string s1("hello world");
s1.find_first_not_of(“abcd");

在s1中从前向后查找不在 “abcd” 中的字母第一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos

  1. 成员函数 find_last_not_of()
string s1("hello world");
s1.find_last_not_of(“abcd");

在s1中从后向前查找不在 “abcd” 中的字母第一次出现的地方,如果找到,返回找到字母的位置,如果找不到,返回string::npos

7.删除string中的字符

string s1("hello worlld");
s1.erase(1,3);//删除子串(1,3)s1="ho worlld"
s1.erase(5);//删除下标5及其后面的所有字符

8.替换string中的字符

string s1("hello world");
s1.replace(2,3, “haha");//将s1中下标2 开始的3个字符换成“haha”
s1.replace(2,3, “haha",0,2);//将s1中下标2 开始的3个字符换成“haha”中下标0开始的2个字符

9.在string中插入字符

string s1("hello world"); 
string s2(“show insert");
s1.insert(5,s2); // 将s2插入s1下标5的位置
cout << s1 << endl;
s1.insert(2,s2,5,3); 
//将s2中下标5开始的3个字符插入s1下标2的位置
cout << s1 << endl;

10.string转换成C语言式char *字符串

string s1("hello world");
printf("%s\n", s1.c_str());
// s1.c_str() 返回传统的const char * 类型字符串,且该字符串以‘\0’结尾。

11.字符串拷贝

string s1("hello world");
int len = s1.length();
char * p2 = new char[len+1];
s1.copy(p2,5,0); 
p2[5]=0;
cout << p2 << endl;
// s1.copy(p2,5,0) 从s1的下标0的字符开始制作一个最长5个字符长度的字符串副本并将其赋值给p2。返回值表明实际复制字符串的长度。

12.字符串流处理

使用流对象istringstream和ostringstream,可以将string对象当作一个流进行输入与输出。使用时必须包含头文件sstream。

  1. 字符串输入流 istringstream
string input("Input test 123 4.7 A");
istringstream inputString(input);
string string1, string2;
int i;
double d;
char c;
inputString >> string1 >> string2 >> i >> d >> c;
cout << string1 << endl << string2 << endl;
cout << i << endl << d << endl << c <<endl;
  1. 字符串输出流 ostringstream
ostringstream outputString;
int a = 10;
outputString << "This " << a << "ok" << endl;
cout << outputString.str();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值