【知识点】C++中的string类型

String类型的定义

基本的C风格定义方法有以下两种:

  1. char *a = "Hello World!";
    直接声明指针型变量指向字符串常量,缺点是内容不可变,不灵活;
  2. char a[20] = "Hello World!";
    声明字符数组并初始化,缺点是最大长度不可变,且相较于string类型灵活性仍较低。

那么就需要定义C++中的std::string类型。
需要先引入头文件string:

#include <string>
using namespace std;

string a = "Hello World!";

int main(){
	printf("%s",a.data());
}

或者利用构造函数:

string s;		//生成空字符串
string s(str);		//生成字符串为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开始到字符串结束的位置作为字符串初值
//算法竞赛只需记忆第一二三条即可

string类型的特点是可以动态改变大小。当字符串内容增添时,它会分配更大的内存空间来存储新的字符串。
注意:string类型有'\0'作为结束符,但一般不会对其交互。

String类型的相关操作

其特点是提供了许多非常方便的成员函数。

size()、length()函数

可以直接获得字符串长度,返回值为size_type类型,不包括'\0',用于表示字符串大小。两个函数没有本质区别,可以互换使用。

#include <iostream>
#include <string>
using namespace std;

string a = "Hello World!";

int main(){
	cout<<a.length()<<endl;
	cout<<a.size()<<endl;
}

输出为

12
12

赋值拷贝

两个string类可以直接用赋值运算符。(免示例)

输入字符串

  1. cin
    cin>>a;
    遇到空格、TAB、换行符都会结束。不会读入空字符。
  2. getline
    getline(cin,a);
    读取一整行。不会读入换行符。
  3. scanf(较复杂,不推荐)
    a.resize(15); scanf("%[^\n]",&a[0]);
    需要先预分配空间,再取首字符地址进行输入。可以正常使用正则表达式。
    若用%s,遇到空格、TAB、换行符结束。不会读入空字符。
    若用%[^\n],读取一整行。不会读入换行符。
    可以指定缓冲区大小,比如%1023s、%1023[^\n]。

比较字符串字典序大小

可以直接使用比较运算符。

#include <iostream>
#include <string>
using namespace std;

string a = "Hello World!";
string b = "Hello World";

int main(){
	cout << (a > b) << endl;
}

输出结果为

1


或调用成员函数compare(),其返回值与C语言中strcmp相同。
cout << a.compare(b) << endl;
输出结果仍为

1


字符串连接

可以直接用拼接符'+'连接。

#include <iostream>
#include <string>
using namespace std;

string a = "Hello";
string b = " World!";

int main(){
	a = a + b;
	cout << a << endl;
}

输出结果为

Hello World!

或使用append()函数。(免示例)

查找、搜索

find()函数,从左往右搜索子串,返回第一个子串首字符索引,如果没有则返回string::npos类型-1;

#include <iostream>
#include <string>
using namespace std;

string a = "Hello";
string b = " World!";

int main(){
	a = a + b;
	cout << a.find('r') << endl;
	cout << a.find(b) << endl;
	cout << a.find('?') << endl;
	if(a.find('?') == string::npos)	cout << -1 << endl;
}

输出结果为

8
5
18446744073709551615
-1

rfind()函数同理,从右往左找子串(免示例)。

替换字符串

replace() 函数可以直接实现替换功能。
三个参数分别为:起始索引、最大替换长度、素材串。

#include <iostream>
#include <string>
using namespace std;

string a = "Hello";
string b = " World!";

int main(){
	a = a + b;
	a.replace(3,5,"ABCDE");
	cout<<a.data();
}

输出结果为

HelABCDErld!

删除子串

erase()函数可以直接实现删除功能。
两个参数分别为:起始索引、删除长度。

#include <iostream>
#include <string>
using namespace std;

string a = "Hello";
string b = " the World!";

int main(){
	a = a + b;
	a.erase(5,4);
	cout<<a.data();
}

输出结果为:

Hello World!
posted @ 2025-01-11 13:44  Alkaid16  阅读(180)  评论(0)    收藏  举报