大家好,本人这两天学习到string这章,发现只是很细碎,因此整理下来
这里只是很粗浅的整理使用方法,不涉及深层原理,希望对你有帮助
1.string概念
C++中引入这个类型来处理字符串,是一种更高级的封装,string中包含大量的方法,是的对字符串的操作更加简单。
必须添加头文件<string>
2.string常见操作
string ⽂档:https://legacy.cplusplus.com/reference/string/string(这个可能很难懂,所以我接下来罗列了一部分)
2.1创建字符串
string s1;//创建空字符串
string s2="hello world";
string s3("hello world");//创建字符串
string s4=s;//用现成的字符串初始化另外一个字符串
注意,s2,s3中的字符串不再以\0作为结束标志了(C形式的字符串是以\0为结束标志的)
注意:这仅仅是示意图,实际上的string类型比这个要复杂的多,需要学习类和对象的知识
string类型和char数组类型还有一个区别:string类型的字符串可以直接赋值,而char类型的数组不行(因为数组名是首元素的地址,地址是常量,怎么能把常量值赋给常量值呢)
2.2string字符串的输入
2.2.1cin
#include<iostream>
using namespace std;
#include<string>
int main()
{
string s;
cin>>s;
cout<<s;
return 0;
}
输入的字符串不带空格没问题,但是如果带空格,就不行了
因为cin在读取字符串的时候,遇到空白字符的时候,就认为字符串结束了,不再继续往后读取剩余的字符,同时将已经读取到的字符串末尾加上\0,直接储存起来
2.2.2getline
需要<string>头文件,用于从输入流中读取一行文本,将其存储为字符串。
有两种不同形式,对应着字符串结束方式
istream& getline (istream& is, string& str);
istream& getline (istream& is, string& str, char delim);
istream 是输⼊流类型, cin 是 istream 类型的标准输⼊流对象。
ostream 是输出流类型, cout 是 ostream 类型的标准输出流对象。
getline 函数是输⼊流中读取⼀⾏⽂本信息,所有如果是在标准输⼊流(键盘)中读取数 据,就可以传 cin 给第⼀个参数。
第一种getline以换行符作为字符串的结束标志,一般格式是:
getline(cin, string str)
//cin -- 表⽰从输⼊流中读取信息
//str 是存放读取到的信息的字符串
这种形式的getline从函数输入流(如cin)中读取文本,直到遇到换行符为止,然后将读取到的文本(不包含\n)存储到指定的string类型的变量str中
第二种getline函数允许用户自定义结束标志
getline(cin, string str, char delim)
//cin -- 表⽰从输⼊流中读取信息
//str 是存放读取到的信息的字符串
//delim 是⾃定义的结束标志
这种形式的getline从函数输入流(如cin)中读取文本,直到遇到⽤⼾指定的结束标志字符为止,然后将读取到的文本(不包含\n)存储到指定的string类型的变量str中
2.3size()
C++中关于字符串的操作函数都是包含在string中的,所以需要调用这些函数的时候,通常使用.点操作符
使用示例:
int main()
{
string s="hello world";
cout<<s.size();<<endl;
return 0;
}
为什么要使用点操作符?
在前面学double char int等内置类型的时候,不需要使用点操作符;string是C++提供的更复杂的封装类型,在string类型的变量中加入了操作字符串的各种函数,比如求字符串长度,字符串末尾插入一个字符等操作。所以要对string类型变量进行各种操作,就可以使用.操作符调用这些函数
那getline为啥不用.操作符?明明也是对string类型的操作呀
因为getline是全局函数,操作的是输入流和字符串对象,而不是字符串对象的内部行为
而size是成员函数,属于std::string类,是字符串队形自身提供的功能
size函数可以用来遍历字符串,注意string类型的字符串是可以用下标访问的
int main()
{
string s = "abcdef";
int i = 0;
for(i = 0; i < s.size(); i++)
{
cout << s[i] << " ";
}
return 0;
}
2.4迭代器
迭代器是一种对象,可以用来遍历容器中的元素,作用类似于指针或数组下标
访问迭代器指向的值需要解引用
string提供了多种迭代器,⽤于遍历和操作字符串中的内容。这⾥给⼤家介绍⼀种最常 ⽤的迭代器。
2.4.1begin() end()
begin():返回指向字符串第一个字符的迭代器,需要一个迭代器的变量来接收。
end():返回指向字符串最后一个字符的下一个位置的迭代器(该位置不属于字符串)
他们返回的迭代器类型是string::iterator
迭代器是可以进行大小比较的,也可以进行+或者-整数运算的
比如it++让迭代器前进一步;it--让迭代器后退一步
同一个容器的两个迭代器也可以相减,结果的绝对值就是两个绝对值中间的元素个数
(很像指针!)
#include <iostream>
using namespace std;
#include<string>
int main()
{
string s="abcdef";
string::iterator it=s.begin();
string::iterator it2=s.end();
cout<<it2-it<<endl;
return 0;
}
正序遍历:
#include <iostream>
using namespace std;
#include<string>
int main()
{
string s="abcdef";
for(string::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<' ';
}
return 0;
}
当然,这里的it可以是auto类型
逆序遍历:
#include <iostream>
using namespace std;
#include<string>
int main()
{
string s="abcdef";
for(string::iterator it=s.end()-1;it>=s.begin();it--)
{
cout<<*it<<' ';
}
return 0;
}
注意-1的问题啊
通过迭代器找到元素后,改变迭代器指向的元素是可以直接改变字符传内容的!(这个跟指针也很像吧~
2.5push_back()
用于在字符串尾部插一个字符
#include<iostream>
using namespace std;
#include<string>
int main()
{
string s;
s.push_back('a');
s.push_back('p');
s.push_back('p');
cout<<s<<endl;
string s2;
for(char c='a';c<='f';c++)
{
s2.push_back(c);
}
cout<<s2<<endl;
return 0;
}
2.6字符串中的+ +=运算
push_back是⽤于在字符串后添加⼀个字符,然⽽部分情况下我们需要向原有的字符串后继续添 加字符串
字符串支持+ +=运算,本质是string中重载了operator这个操作符
#include<iostream>
using namespace std;
#include<string>
int main()
{
string s="hello ";
s+="world";
cout<<s<<endl;
string s1="hello ";
cout<<s1+"world"<<endl;//s1是不会变的
string s2="hello"
cout<<"world "+s2<<endl;//可以灵活的拼接在头部或尾部
return 0;
}
2.7pop_back
用于删除字符串中尾部的一个字符。在C++11标准中引入,有的编译器可能不支持
int main()
{
string s = "hello";
cout << "s:" << s << endl;
//尾删
s.pop_back();
cout << "s:" << s << endl;
//尾删
s.pop_back();
cout << "s:" << s << endl;
return 0;
}
但是当字符串中没有字符的时候,再调用这个函数,程序会出现异常,是未定义行为,要避免这么使用
为了避免这种情况,我们可以:
while(s.size() > 0) //通过size()函数来控制字符串的⻓度
{
s.pop_back();
}
先写到这里~马上更新下面的部分