火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

第三课 字符串常见用法

作者: 作者的头像   huolong , 时间:2023-01-10 09:45:19 , 所有人可见, 阅读  13

在C语言中,一般使用字符数组 char str[]来存放字符 串,但是操作麻烦,容易出错。

C++在STL中加入了string类型,对字符串常用的需求功能进行了封装,使得操作起来更加方便,且不必担心内存是否足够、字符串的长度等问题。

使用string,需要添加string头文件,即#include <cstring>,

同时必须要有using namespace std。

定义string的方法为:string name;

其中,name是字符串变量的名字。例如:string str;

也可以定义的同时初始化,即:string str="abcd"。

1. string 的访问

一种访问 string 的方法,就像普通字符数组一样操作。例如:

string str= "abcd"; 
for(int i = 0; i < str.length(); i++)
    printf("%c",str[i]); // 输出 abcd  

如果要读入或者输出整个字符串,一般只能用cin和cout。如果非要用printf输出string,则需要用c_str()函数将string转换成字符数组。例如:

string str;    
cin>>str;    
cout<<str<<endl;    
printf("%s\n",str.c_str());

另一种访问string的方法是通过迭代器,主要与insert()、erase()等函数配合使用。

先定义string迭代器:string::iterator it;

然后就可以通过“*it”来访问string里的每一个字符了,而且string和vector一样,支持直接对迭代器进行加减某个数字,如str.begin()+3等。例如:

string str="abcdefg";
for(string::iterator it = str.begin()+2; it != str.end(); it++)
    printf("%c",*it);//输出cdefg

2. string 的运算

字符串可以做“加法”运算。加法是把两个字符串直接拼接起来。例如:

string str1= “ abc “ ,str2= “ xyz “ ,str3;
str3 = str1 + str2;
str1 += str2;
cout << str1 << endl;// 输出 abcxyz
cout << str3 << endl;// 输出 abcxyz
字符串还可以做“关系”运算,是按照字典序比较两个 string 类型的大小。例如:
string str1= “ aa “ ,str2= “ aaa “ ,str3= “ abc “ ;
if(str1 < str2) printf( “ OK1 “ );// 输出 OK1
if(str1 < str3) printf( “ OK2 “ );// 输出 OK2

3. string 的常用函数

(1)length()和size()

用来返回 string 的长度(字符个数),size()与 length()一样,时间复杂度为O(1)。

(2)clear()

用来清空 string 中的所有元素,时间复杂度为O (1)。

(3)substr()

str.substr(pos,len) 返回从 pos 号位置开始、长度为 len 的子串,时间复杂度为O (n)。

(4)insert ()

有多种写法,时间复杂度都是O (n)。

str.insert(pos,string),表示在pos号位置插入字符串string。
举例:
string s = "abcd";
s.insert(1,"hl");
cout << s;

str.insert(it,it2,it3),it为原字符串的欲插入位置,it2和it3为待插入字符串的首尾迭代器(左闭右开区间)。

(5)erase()

可以删除单个元素,也可以删除一个区间内的所有元素,时间复杂度均为O (n)。

删除单个元素用erase(it),it为要删除的元素的迭代器。删除一个区间内的所有元素可以用两种方法。

str.erase(first,last),first为区间的起始迭代器,last为区间的末尾迭代器的下一个地址,也就是左闭右开的区间[first,last)。
举例:
string s = "abcd";
s.erase(s.begin()+2, s.end());
cout << s;//ab

str.erase(pos,length),pos为需要删除的字符串起始位置,length为要删除的字符个数。 
举例:
string s = "abcd";
s.erase(1,2);
cout << s;//输出ab

(6)find()和rfind()

str.find(str2),当str2是str的子串时,返回其在str 中第一次出现的位置;否则返回 string::npos。string::npos是一个常数,其本身的值等于-1,但由于是unsigned int类型,因此,也可以认为是unsigned int类型的最大值(4294967295)。
str.find(str2,pos),是从str的pos号位开始匹配str2,返回值同str.find(str2)。
以上两种写法的时间复杂度都是O(n*m),其中n和m分别为str和str2的长度。

(7)replace()

str.replace(pos,len,str2)表示把str从pos号位开始、长度为len的子串替换为str2。

也可以写成str.replace(it1,it2,str2),表示把str的迭代器it1~it2范围内(左闭右开区间)的子串替换为str2。时间复杂度都是O(str.length)。

(8)back()

获取最后一个字符。

string a="abcd";

1.获取字符串最后一个字符
char b=a.back(); //结果为 b='d';

2.修改字符串最后一个字符
a.back()='!'; //结果为 a="abc!";

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码