C++笔记(四)~string
初始化string对象
初始化方法
- string s1:默认初始化,s1是一个空串
- string s2(s1): s2是s1的副本
- string s2=s1:等价于s2(s1),s2是s1的副本
- string s3("value"):s3是字面值"value"的副本,除了字面值最后的那个空字符除外
- string s3="value":等价于s3("value"),s3是字面值"value"的副本
- string s4(n,'x'):将s4初始化为由连续n个字符x组成的串
直接初始化与拷贝初始化
- 直接初始化:不使用等号(=)初始化一个变量 例如:string s("haihong") \ string s(10,'x')
- 拷贝初始化:使用等号(=)初始化一个变量 例如:string s="haihong"
string对象上的操作
操作方式
- os<<s 将s写到输出流os中,返回os
- is>>s 从is中读取字符串赋给s,字符串以空白分隔,返回is
- getline(is,s) 从is中读取一行赋给s,返回is
- s.empty() s为空,返回true,反之返回false
- s.size() 返回s中字符的个数(返回类型是string::size_type,无符号类型)
- s[n] 返回s中第n个字符的引用,n从0计起
- s1+s2 返回s1、s2连接后的结果
- s1=s2 用s2的副本代替s1中原来的字符
- s1==s2 如果s1与s2中的字符完全一样,返回true,反之返回false
- s1!=s2 如果s1与s2中的字符完全一样,返回false,反之返回true
- <,<=,>,>=
读取string对象(cin>>s、cout<<s)
示例代码
#include<iostream>
using namespace std;
int main(){
string s;
cout<<"输入字符串:";
cin>>s;
cout<<"s="<<s<<endl;
return 0;
}
运行结果
注意
在执行读取操作的时候,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一处的空白为止。
比如在上述代码输入:" my name is haihong " ,最后得到的结果:"my"
测试结果
getline(is,s)
语法
- is:输入流
- s:string对象
作用
从给定的输入流中读入内容,直到遇到换行符为止(换行符也被读进去了,只是在返回结果的时候,换行符又会被丢弃),然后将所读入的内容存入string对象中(不存那个换行符)
示例
#include<iostream>
using namespace std;
int main(){
string line;
// 每次读入一整行 直到读到文件末尾 这么本意is应该从文件中读入
while(getline(cin,line)){
cout<<line<<endl;
}
return 0;
}
empty()
用法
s.empty()
作用
- s为空 返回true
- s不为空 返回false
示例代码
#include<iostream>
using namespace std;
int main(){
string s1;
string s2="haihong";
cout<<"s1.empty()="<<s1.empty()<<endl;// 1=true
cout<<"s2.empty()="<<s2.empty()<<endl;// 0=false
return 0;
}
运行结果
size()
用法
s.size()
作用
返回string对象s中字符的个数,注意返回的类型不是int,而是string::size_type()类型
示例代码
#include<iostream>
using namespace std;
int main(){
string s1;
string s2=" ";//一个空格
string s3="haihong";//7个字符
cout<<"s1.size()="<<s1.size()<<endl;
cout<<"s2.size()="<<s2.size()<<endl;
cout<<"s3.size()="<<s3.size()<<endl;
return 0;
}
运行结果
易错点:s.size()返回的是string::size_type()类型,不是一般的int,是无符号类型的值。
示例代码
#include<iostream>
using namespace std;
int main(){
string s="haihong";
int n=-1;
bool flag=(s.size()>n);
cout<<"flag="<<flag<<endl;
return 0;
}
运行结果
结果是不是很意外?常规思考:s="haihong"==>s.size()=7==>(7>-1)==>s.size()>n 最后flag应该返回true,也就是1啊!为啥是0呢?
哈哈 ,这里因为s.size()返回的是string::size_type()类型,无符号类型,int碰到无符号类型时,会自动转换为无符号类型了,(int)-1=(unsigned)(),所以会返回false。
注:这里假设int是32位存储,int类型-1实际是10000...01 ,转换为无符号数其实就是第一位不是符号位了,转换就后是:
string对象的比较(>、<、<=、>=)
规则(s1与s2比较时)
- 如果s1与s2长度相同,则从s1、s2中的第一个字符开始比较(比较字符的ASCII码):如果二者ascii值一样,则进行第二个字符的比较....;反之,返回比较结果即可。比如字符A的ascii值是65,字符a的ascii值是97,那么二者比较结果为A<a
- 如果二者长度不同且较短的字符串对象中的每一个字符值都相等与较长字符串对应的字符,那么较短的字符串就小于较长的字符串。
- 其他情况就按从左到右依次比较即可。
示例代码
#include<iostream>
using namespace std;
int main(){
string s1="A";
string s2="D";
string s3="a";
string s4="d";
cout<<"s1<s2 "<<(s1<s2)<<endl;// A<D true
cout<<"s3<s4 "<<(s3<s4)<<endl;// a<d true
cout<<"s1<s3 "<<(s1<s3)<<endl;// A<a true
string s5="hello";
string s6="helloworld";
string s7="hi";
cout<<"s5<s6 "<<(s5<s6)<<endl;// hello<helloworld true
cout<<"s6<s7 "<<(s6<s7)<<endl;// helloworld<<hi true
}
运行结果
注:ASCII码查询
两个string对象相加(s1+s2)
作用
两个字符串拼接为一个新的字符串
示例代码
#include<iostream>
using namespace std;
int main(){
string s1="my name is haihong.";
string s2="hello world";
cout<<"s1+s2="<<(s1+s2)<<endl;
}
运行结果
字面值与string对象相加
什么是字面值呢?
举个简单的例子吧
int a=3 // 3是字面值
string s="haihong" //haihong是字面值
易错点:必须确保"+"两边至少有一个string对象
示例代码
#include<iostream>
using namespace std;
int main(){
string s0="haihong";// s0是string对象
string s1=s0+"pro";// s0是string对象 pro是字面值
string s2="haihong"+"pro";//两者都是字面值 会报错
return 0;
}
运行结果
遍历string对象
示例代码
#include<iostream>
using namespace std;
int main(){
string s="my name is hiahong";
// 方法一:使用下标
cout<<"方法一:"<<endl;
for(int i=0;i<s.size();++i){
cout<<s[i]<<" ";
}
cout<<endl;
// 方法二 c++11特性 因为知道每个元素是char类型 所以就是char ch:s
cout<<"方法二:"<<endl;
for(char ch:s){
cout<<ch<<" ";
}
cout<<endl;
// 方法三 c++11特性 使用auto
cout<<"方法三:"<<endl;
for(auto ch:s){
cout<<ch<<" ";
}
cout<<endl;
}
运行结果
- 点赞
- 收藏
- 关注作者
评论(0)