C++string类使用大全
目录
温馨提示:这篇文章有约两万字
什么是string类?
一. 定义和初始化string对象
1.string的构造函数的形式:
2.拷贝赋值运算符
3.assign函数
二.string对象上的操作
1.读写string对象
2.读取未知数量的string对象
3.使用getline 读取一整行
4.string对象的大小和容量:
编辑
4.1string::size_type类型
5.string的字符串比较
5.1用关系运算符
5.2用compare函数
编辑
6.string的加法
6.1两个string对象相加
6.2字面值和string对象相加
7 元素访问
7.1下标访问
7.2at函数
8.substr操作
9.insert函数
10.append 和replace函数
11.string的搜索操作
12 string的遍历:借助迭代器 或者 下标法
13. string的删除:erase()
14、 string的字符替换:
15. string的大小写转换:
16、 string的查找:find
17、 string的排序:sort(s.begin(),s.end())
18、 string的分割/截取字符串:strtok() & substr()
数值的转换
string 和数值之间的转换
什么是string类?
在C++中,string
是一个用于处理字符串的类,它属于C++标准库中的一部分。
string
类提供了一种方便且安全的方式来处理字符序列,相比于C语言中的字符数组(即C-style strings)或字符指针,C++的string
类提供了更多的功能和更好的安全性。
作为标准库的一部分,string定义在命名空间std中。接下来的示例都假定已包含了下述代码:
#include <string>
using std::string;
一. 定义和初始化string对象
string对象可通过构造函数和拷贝赋值运算符来初始化string对象
我们可以先看看string的构造函数是如何初始化string对象的
1.1. string的构造函数的形式:
string str;//生成空字符串string s(str);//字符串s为str的副本string s(str, strbegin,strlen);
//将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值string s(cstr, char_len);
//以C_string类型cstr的前char_len个字符串作为字符串s的初值string s(num ,c);
//生成num个c字符的字符串string s(str, stridx);
//将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值
我们看个例子
#include <iostream>
#include <string>
using namespace std;void test1()
{
string str1; //生成空字符串
string str2("123456789"); //生成"1234456789"的复制品
string str3("12345", 0, 3);//结果为"123"
string str4("0123456", 5); //结果为"01234"
string str5(5, '1'); //结果为"11111"
string str6(str2, 2); //结果为"3456789" cout<<"str2:"<<str2<<endl;
cout<<"str3:"<<str3<<endl;
cout<<"str4:"<<str4<<endl;
cout<<"str5:"<<str5<<endl;
cout<<"str6:"<<str6<<endl;
}int main()
{
test1();
return 0;
}
特别注意:
1.2. 拷贝赋值运算符
string类型的对象可以直接相互赋值!!
string s1;
string s2=s1;//s2是s1的副本
string s3="hello";//s3是字面值"helo"的副本,除了那个空字符之外
1.3. assign函数
在C++的std::string类中,assign()函数用于给字符串赋值。这个函数有多种重载形式,可以接受不同类型的参数,以便从其他字符串、字符数组、单个字符或子字符串来分配内容。
以下是assign()函数的一些常见用法:
从另一个std::string对象赋值:
std::string str1 = "Hello";
std::string str2;
str2.assign(str1); // str2 现在包含 "Hello"
从C风格的字符串(字符数组)赋值:
const char* cstr = "World";
std::string str;
str.assign(cstr); // str 现在包含 "World"
从单个字符赋值,并指定重复次数:
char ch = 'a';
std::string str;
str.assign(5, ch); // str 现在包含 "aaaaa"
从另一个std::string的子字符串赋值:
std::string str = "Hello, World!";
std::string subStr;
subStr.assign(str, 7, 5); // 从索引7开始,长度为5的子字符串,subStr 现在包含 "World"
注意,在上面的例子中,子字符串的索引是从0开始的,并且长度参数指定了要复制的字符数(不包括结束的空字符)。
从迭代器范围赋值:
如果你的数据来自标准库容器(如std::vector或std::list),你可以使用迭代器来指定要复制的范围。但是,由于std::string本身不是基于迭代器的容器,这种用法并不常见。但如果你有一个字符类型的容器,并且想将其内容转换为std::string,这种方法可能会有用。
std::vector<char> vec = {'H', 'e', 'l', 'l', 'o'};
std::string str;
str.assign(vec.begin(), vec.end()); // str 现在包含 "Hello"
从初始化列表赋值(C++11及更高版本):
std::string str;
str.assign({'a', 'b', 'c'}); // str 现在包含 "abc"
// 或者直接使用初始化列表构造函数
std::string anotherStr = {'d', 'e', 'f'}; // anotherStr 现在包含 "def"
使用assign()函数可以灵活地给字符串分配新的内容,同时替换掉字符串中原有的内容。如果assign()函数接收的参数会导致新字符串的长度超过当前字符串的容量,那么std::string可能会重新分配内存以存储新的内容。
二.string对象上的操作
一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。
其中,类既能定义通过函数名调用的操作,下面列举了string的大多数操作。
os<<s
//从is中读取字符串赋给s,字符串以空白分隔,返回isis>>s
//从is中读取一行赋给s,返回isgetline(is,s)
//从is中读取一行赋值给s,返回iss.empty()
//s为空返回true,否则返回falses.size()
//返回s中字符的个数s[n]
//返回s中第n个字符的引用,位置n从0计起s1+s2
//返回s1和s2连接后的结果sl=s2
//用s2的副本代替s1中原来的字符s1==s2
s1!=s2
//如果s1和s2中所含的字符完全一样,则它们相等;string对象的相等性判断对字母的大小写敏感<,<=,>,
//利用字符在字典中的顺序进行比较,且对字母的大小写敏感
2.1. 读写string对象
我们可以使用标准库中的iostream来读写int、double等内置类型的值。同样,也可以使用IO操作符读写string对象:
注意:要想编译下面的代码还需要适当的#include 语句和using声明
int main()
{
string s;//空字符串cin >>s;//将string对象读入s,遇到空白停止cout << s << endl;//输出s
return 0;
}
这段程序首先定义一个名为s的空string,然后将标准输入的内容读取到s中。在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。
如上所述,如果程序的输入是
Hello World!
则输出将是
Hello
输出结果中没有任何空格。
和内置类型的输入输出操作一样,string对象的此类操作也是返回运算符左侧的运算对象作为其结果。因此,多个输入或者多个输出可以连写在一起:
string s1, s2;
cin >>s1 >> s2;// 把第一个输入读到 s1中,第二个输入读到 s2中
cout << sl << s2 << endl;
//输出两个string对象
假设给上面这段程序输入与之前一样的内容
Hello World!
输出将是
HelloWorld!
这⾥我们可以发现,其实 cin 的⽅式给 string 类型的字符串中输⼊数据的时候,可以输⼊不带空 格的字符串。但是如果带有空格,遇到空格也就读取结束了,没有办法正常读取,那怎么办呢?解决 办法就是使⽤ getline
2.2. 使用getline 读取一整行
有时我们希望能在最终得到的字符串中保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。
getline 是C++标准库中的⼀个函数,⽤于从输⼊流中读取⼀⾏⽂本,并将其存储为字符串。 getline 函数有两种不同的形式,分别对应着字符串的结束⽅式。
感兴趣的可以去这里看看:getline (string) - C++ Reference
我们先讲讲第一种getline
第⼀种 getline 函数以换⾏符( '\n' )作为字符串的结束标志,它的⼀般格式是:
getline(cin, string str)//cin -- 表⽰从输⼊流中读取信息//str 是存放读取到的信息的字符串
getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意换行符不被存进string对象)。
getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。如果输入真的一开始就是换行符,那么所得的结果是个空string。
和输入运算符一样,getline 也会返回它的流参数。因此既然输入运算符能作为判断的条件,我们也能用getline的结果作为条件。
例如,可以通过改写之前的程序让它一次输出一整行,而不再是每行输出一个词了:
因为line中不包含换行符,所以我们手动地加上换行操作符。和往常一样,使用endl结束当前行并刷新显示缓冲区。
触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符。
第二种getline
第⼆种 getline 函数允许⽤⼾⾃定义结束标志,它的⼀般格式是:
getline(cin, string str, char delim)//cin -- 表⽰从输⼊流中读取信息//str 是存放读取到的信息的字符串//delim 是⾃定义的结束标志
函数从输入流中读取文本,直到遇到用户指定的结束标志字符(delim),然后将读取到的文本(不包括结束标志字符)存储到指定的string类型变量str中。
2.3. size()和length()
- size()和length():返回string对象的字符个数,他们执行效果相同。