C++(标准库):43---string字符串

一、string简介

  • 概念:string表示可变长的字符序列,string作为标准库的一部分
  • 使用前需要导入头文件与命名空间,string定义在std中
#include <string>
using std::string;

二、string对象的初始化

1.几种初始化方式

string s1;  //默认初始化,s1是一个空串
string s2(s1);
string s2=s1;
string s3(s2);
string s3="value";
string s4(n,'c'); //初始化n个字符c

2.构造string的其他方法

//参数:1.数组 2.长度(可省略)
string s(arr+2);//从arr数组+2索引出构造到最后
string s(arr,n);//初始化arr数组中的前n个字符

//参数:1.string对象 2.索引(可省略) 3.长度(可省略)
string s(s2,pos);//从s2对象的pos索引出开始构造一直到末尾
string s(s2,pos,len);//从s2的pos索引出构造len长度字符串

2.直接初始化和拷贝初始化

  • 直接初始化:不使用=号来初始化一个变量
  • 拷贝初始化:使用=号来初始化一个变量

三、string对象的读取

1.读取规则:读取string对象时,从第一个字符开始读取,会自动忽略开头的空白(空格符、制表符、换行符等...),遇到空白时就结束读取

string s;
cin>>s;
cout<<s;
  • 上面的代码,如果程序输入的是"  hello  world!  ",则输出的结果是"hello",输出结果中没有空白

2.读取未知数量的string对象

  • 可以通过while循环反复读取
string word;
while(cin>>word)//反复读取,直到读取到文件尾部
{
    cout<<word<<endl;
}

3.使用getline读取一整行

  • ①概念:有时我们希望在读取的字符串中保留输入时的空白符,这时可以使用getline函数代替原来的>>运算符
  • ②getline参数:参数1:一个输入流  参数2:一个string对象
  • ③注意:函数从给定的输入流中读取内容,直到换行符为止(换行符也被读进来了),然后把所读的内容存入string对象中,但是这个string对象中不含有换行符
string line;
while(getline(cin,line))
{
    cout<<line<<endl;
}

四、strig对象的遍历

1.通过[]运算符直接取值

string s1="HelloWorld";
cout<<s1[1];//'e'
cout<<s1[2];//'l'

2.for循环遍历

string s="HelloWorld";
foreach(auto c:s)
{
    cout<<c<<endl;
}

3.迭代器遍历

string s= "HelloWorld";
string::iterator i;
for (i = s.begin(); i != s.end(); ++i)
{
    cout << *i;
}

五、string对象的相加、比较

1.+、=、==、!=等运算符操作

s1+s2;  //string对象相加
s1=s2;  //string对象赋值
s1==s2; //string对象比较
s1!=s2; //同上 

2.<、<=、>、>=等运算符操作

string比较运算符依照(大小写敏感的)字典顺序

string s1="Hello";
string s2="Hello world";
string s3="Hiya";

上述代码中,s2>s1,s3>s2,s3>s1

3.string对象的相加操作

注意(重点):string对象使用+运算符时,运算符的两侧必须有一个string类型的对象,不能是两个字符串字面值相加,否则会发生错误

string s1="Hello"+"World"; //错误

string s1="Hello";
string s2=s1+"World"; //正确
string s3=s2+"My"+"Name is";
//正确,前面的s2+"My"相加返回一个string类型对象,然后再于"Name is相加"

六、string函数

1.empty()、size() 

s.empty();//s为空返回true,否则返回false
s.size();//返回s中的字符个数

2.substr():截取字符串

参数:1.起始索引   2.终止索引(可省略,省略时一直截取到对象结尾,不包括在内)

  • 只返回string对象,但不改变原string对象
string s("Hello World");
string s2=s.substr(0,5);//Hello
string s3=s.substr(6);//World

 3.insert()

功能:在string对象指定索引出插入新字符串,参数多变

string s="HelloWorld";

s.insert(s.size(),5,'!');//在s的末尾插入5个'!'
s.insert(s.size(),"I am")//在末尾插入"I am"
s.insert(s.size(),s+5);//在s的末尾插入"World"
s.insert(s.size(),s+5,3);//在s的末尾插入"Wor";

4.assign()

功能: 将原string对象的内容更改为参数中指定的内容,参数多变

string s="HelloWorld";

string s2="My Name is"
s2.assign(s);//"HelloWorld"
s2.assign(s,0,5);//"Hello"
s2.assign(s,5);//"World"

5.append()

功能:在尾部追加内容

string s="HelloWorld";
string s2="I am Dong";

s.append("I am");
s.append(s2,2);//尾部追加"am Dong"
s.append(s2,2,2);//尾部追加"am"

6.replace()

功能: 替换string对象中的内容,参数多变,其中前两个参数是一个更换索引范围

string s="HelloWorld";
string s2="I am Dong ";
s.replace(0,5,s2);//s变为I am Dong World
s.replace(0,5,s2,5);//s变为Dong World
s.replace(0,5,s2,0,5);//s变为 I am World

7.erase()

功能: 删除string对象内容,参数:1.起始索引 2.删除长度(可省略,省略时删除到末尾)

string s="HelloWorld";
s.erase(0,5);//删除Hello
s.erase(5);//删除World

8.compare()

功能:比较函数,与参数中的内容进行比较

  •  返回值: 等于返回0,大于返回正数,小于返回负数
string s="HelloWorld";
string s2="HelloWorld";
s.compare(s2);//返回0
s.compare(0,5,"World");//返回负数,从s0索引开始5个字符与参数3比较
s.compare(0,5,"I am Hello",5,5);//返回0,从s索引0开始的5个字符与参数3索引5开始的5个字符比较

char* arr = "Hello";
s.compare(arr);//返回0
s.compare(0, 5, arr);//返回0,从s索引0开始5个字符与arr比较
s.compare(0,5,arr+1,4);//返回负数,从s索引0开始5个字符与arr+1索引处的4个字符开始比较

9.查找函数

 每次搜索返回一个sitrng::size_type类型的索引。如果查找失败,返回npos(一个const string::size_type类型,值为-1)

s.find(args);  //查找s中args第一次出现的位置
s.rfind(args); //查找s中args最后一次出现的位置
s.find_first_of(args); //查找s中args任何一个字符第一次出现的位置
s.find_last_of(args);  //查找s中args任何一个字符最后出现的位置
s.find_first_not_of(args); //查找s中第一个不在args中的位置
s.find_last_not_of(args);  //查找s中最后一个不在args中的位置

参数args可以为下面的一种
c,pos    从s中pos索引处开始查找字符c
s2,pos   从s中pos索引处查找字符串s2
cp,pos   从s中pos索引处查找指针cp指向的字符/字符串
cp,pos,n 从s中pos索引处查找cp指向的数组的前n个字符
string s("HellHeo");
auto pos1=s.find("He");//返回索引0
auto pos2=s.rfind("He");//返回索引4
string s1("012345");
string s2("a8c5");
auto pos=s2.find_first_of(s1);//返回1
//返回s2中第一个数字的索引
string number("0121345");
string s("5412Hello");
auto pos=s.find_first_not_of(number);//返回4
//返回s中第一个不是数字的字符索引

七、数值转换函数

字符串中常常包含表示数值的字符,如果获取这些数值字符或者把数值变为字符串,这时需要用到一些函数

//将数值转换为字符串,参数可以为:int,float....
to_string(val);

//返回字符串的第一个整数子串
//参数:1.字符串 2.保存参数1中的第一个非数值字符下标(默认为0,可省略) 3.表示转换所用的基数(可省略)
stoi(s,p,b); //返回值为int
stol(s,p,b); //返回值为long
stoul(s,p,b);//返回值为unsigned long
stoll(s,p,b);//返回值为long long
stolull(s,p,b);//返回值为unsigned long long

//返回字符串中的第一个浮点数子串
//参数:1.字符串 2.保存参数1中的第一个非数值字符下标(默认为0,可省略)
stof(s,p);//返回值为float
stod(s,p);//返回值为double
stold(s,p);//返回值为long double
int i=42;
string s=to_string(i);//将整数42转换为字符串
double number=stod(s);//将字符串s转换为double
string s = "pi = 3.14";
double number = stod(s.substr(s.find_first_of("+-.01234")));
cout << number<< endl;//输出3.14

原理:find_first_of函数先找到s中第一个为数字的索引,然后通过substr获取"3.14",最后再用stod()函数转换为double类型

八、处理string对象中的字符函数

概念:我们经常需要处理strinf对象中的字符,比如说检查一个string对象是否含有空白、或者把string对象中的字母改成小写、检查是否有特定字符出现等等,这时我们需要使用一些特定的函数

  • 这些特定函数包含在<cctype>头文件中
  • 参数是字符类型
isalnum(c);//当c字母或数字时为真
isalpha(c);//当c是字母时为真
iscntrl(c);//当c是控制字符时为真
isdigit(c);//当c是数字时为真

isgraph(c);//当c不是空格但可以打印时为真
isprint(c);//当c是可打印字符时为真(即c是空格或c具有可视形式)
ispunct(c);//当c是标点符号时为真(即c不是控制字符、数字、字母、可打印空白中的一种)
isspace(c);//当c是空白时为真(即c是空格、制表、回车、换行、进纸符中的一种)

isxdigit(c);//当c时十六进制数字时为真
islower(c);//当c是小写字母时为真
isupper(c);//当c是大写字母时为真
tolower(c);//如果c是大写字母,输出对应的小写字母ascii码,否则原样输出
toupper(c);//如果c是小写字母,输出对应的大写字母ascii码,否则原样输出

九、string::size_type

概念:对于string对象的size()函数或者是string对象的索引,返回的是一个string::size_type类型的值,通过域操作符来表明size_type是在类string中的

  • 使用size_type一定要使用string域操作符
  • 因此我们在获取size()函数的返回值时尽量避免使用int
string s="HelloWorld";
auto len=s.size(); //auto是一个string::size_type类型

十、c_str()函数

功能

  • string类型的字符串不能直接转换为char*类型的字符串。需要使用c_str()进行转换才行

返回值

  • c_str()返回的是const char*类型
string str1 = "HelloWorld";

char *str2=str1;         //错误
const char *str2=str1;   //错误
char *str3=str1.c_str(); //错误(c_str()返回的是const类型,不能初始化非const类型)
const char *str2 = str1.c_str(); //正确
发布了1594 篇原创文章 · 获赞 1190 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/105486700