c++ string 删除字符_字符串操作的全面总结(附完整代码)

字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃。本文总结了一些构建string对象方法、修改string对象的方法、string类型的操作函数、string类型的查找、string对象的比较。

1 构建string对象方法

首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下:#include 声明一个字符串变量很简单:string Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:String类函数说明
string s;生成一个空字符串s
string s(s2);拷贝构造函数 生成s2的复制品
string s("value");用字符串value初始化s
string s(b,e);以区间b,e内的字符作为字符串s的初值
string s(cp,n);取字符数组,前n个字符作初值
string s(s2,pos2);将字符串s2"始于位置pos2"部分当作字符串的初值
string s(s2,pos1,len);将字符串s2内"始于pos1且长度最多len"的部分作为字符串的初值
s.~string();销毁所有字符,释放内存
代码实例:
#include 
#include
using namespace std;
//20200527 测试字符串操作
int main()
{
string s1;
cout <
string s2(10,'f');
cout <
string s3(s2);
cout < //只是构造的时候拷贝s2,修改其中一个不会影响另一个,s3输出位ffffffffff
string s4(s3.begin(),s3.begin()+(s3.size())/2); //定义s4用迭代器做参数,从第一个迭代器s3.begin()
cout <
char *cp = "Hello"; //最后有空字符/0
char c_array[] = "world!!!!"; //最后有空字符/0
char no_null[] = {'H','e','l','l','0'}; //最后没有空字符/0,不算C语言字符串,只是字符数组
string ss1(cp);
cout <
string ss2(c_array,5);
cout <
string ss3(c_array+5,4);
cout <
//string ss4(no_null);//用字符数组为ss4赋值,因为找不到/0,不知道拷贝几个会出错
string ss5(no_null,2); //这次取2个就知道什么时候结束,不会出错
cout <
s1 = "Hello";
cout << s1 << endl; //s1输出Hello
string s6(s1,2);
cout << s6 << endl; //用s1初始化s6,2表示字符下标,从第二个字符开始到最后,s6为llo
string s7(s1,0,2);
cout << s7 << endl; //从s10开始取2个,s7为He
string s8(s1,0,8);
cout << s8 << endl; //从s1的第一个开始取8个,不够8个就结束,s8为Hello
return 0;
}
** 运行结果**:23d63f3f88c6b7a5ac2eb993988e8007.png

2 修改string对象的方法

与容器共有的 string 操作:与容器共有的 string 操作方法说明
s.insert(p,t);在迭代器 p 指向的元素之前插入一个值为 t 的新元素,返回指向新插入元素的迭代器
s.insert(p,n,t);在迭代器 p 指向的元素之前插入 n 个值为 t 的新元素
s.insert(p,b,e);在迭代器 p 指向的元素之前插入迭代器 b 和 e 标记范围内所有的元素。返回 void
s.assign(b,e);在迭代器 b 和 e 标记范围内的元素替换 s。string类型,返回 s;容器类型返回 void
s.assign(n,t);用值为 t 的 n 个副本替换 s。对于 string 类型,该操作返回 s;对于容器类型,则返回 void
s.erase(p);删除迭代器 p 指向的元素。返回一个迭代器,指向被 删除元素后面的元素
s.erase(b,e);删除迭代器 b 和 e 标记范围内所有的元素。返回一个迭代器,指向被删除元素段后面的第一个元素
代码实例
#include 
#include
using namespace std;
//2020.05.27 测试字符串操作
int main()
{
string s("hello");
string s2("abcdef");
string::iterator p = s.begin(); //迭代器p
s.insert(p,'A'); //在迭代器p指向的s开始之前插入A
cout << s << endl; //s为Ahello
s.insert(p,3,'B'); //p指向返回的Ahello的A处,在A之前插入3个B
cout << s << endl; //s为BBBAhello
string::iterator b = s2.begin(); //迭代器b
string::iterator e = s2.end(); //迭代器e
//p = s.begin(); //p指向s
s.insert(p,b,e); //在p指向的s之前插入b和e迭代器范围内的元素abcdef
cout << s << endl; //s为abcdefBBBAhello
s = "hello";
cout << s << endl; //s为hello
s.assign(b,e); //s所有的元素倍替换为b到e之间的元素,b与e之间为s2
cout << s << endl; //s为abcdef
s.assign(8,'K');
cout << s << endl; //s为KKKKKKKK
p = s2.begin(); //迭代器p指向s2的a
s2.erase(p); //删除迭代器p指向的元素a
cout << s2 << endl; //s2为bcdef
p = s2.begin(); //a被删除,p指向b
p++; //指向c
p++; //指向d
string::iterator p2 = s2.end(); //p2迭代器指向f
p2--; //指向e
s2.erase(p,p2); //删除p指向的d和p2指向的e之间的元素
cout << s2 << endl; //s2为bcf
return 0;
}
运行结果
d560e4922a4cbc185ccb9e139047a679.png运行结果
string 类型特有的版本:string以数组的形式存储,可以用数组的下标进行修改操作:string 修改操作方法说明
s.insert(pos,n,c);在下标 pos 的元素之前插入 n 个字符 c
s.insert(pos,s2);在下标 pos 的元素之前插入 string 对象 s2
s.insert(pos,s2,pos2,len);在下标为 pos 的元素之前插入 s2 中从下标   pos2 开始的 len 个字符
s.insert(pos,cp,len);在下标为 pos 打元素之前插入 cp 所指向数组的前len 个字符
s.insert(pos,cp);在下标为 pos 的元素之前插入 cp 所指向的以空字符结束的字符串副本
s.assign(s2);用 s2 的副本替换 s
s.assign(s2,pos2,len);用 s2 中从下标 pos2 开始的 len 个字符替换 s
s.assign(cp,len);用 cp 所指向数组的前 len 个字符副本替换 s
s.assign(cp);用 cp 所指向的以空字符结束的字符串替换 s
s.erase(pos,len);删除从下标 pos 开始的 len 个字符
代码实例
#include 
#include
using namespace std;
//2020.05。27 测试字符串操作
int main()
{
string s("hello");
string s2("abc");
s.insert(0,3,'A'); //在s下标是0之前插入3个A
cout << s << endl; //s为AAAhello
s.insert(5,s2); //在AAAhello下标是5的元素之前插入abc
cout << s << endl; //s为AAAheabcllo
s2 = "123456";
s.insert(0,s2,2,3); //在s的下标是0之前插入s2下标为2开始往后的3个元素345
cout << s << endl; //s为345AAAheabcllo
char *cp = "Stately plup Buck";
s.assign (cp,7);
cout << s << endl; //s为Stately
s.assign(cp); //没有长度,默认是拷贝全部
cout << s << endl; //s为Stately plup Buck
s = "hello";
s.insert (0,cp,7);
cout << s <
s.insert(0,cp);
cout << s <
s = "hello";
s2 = "abcdef";
s.assign(s2,2,3); //s2中下标为2开始3个元素赋值给s;
cout << s <
s.assign(s2);
cout << s <
s.erase (2,3); //从下标为2开始删除s中的3个元素
cout << s <
s = "123456789";
s.erase(s.size()-5,5); //删除s中后5个
cout << s <
s.insert(s.size(),5,'!'); //在s下标为s.size()处,插入5个!
cout << s <
s = "abc";
s.erase(0,1).insert(0,"A"); //先从下标为0之前删除一个a为bc,再插入A
cout << s <
s = "abc";
s[0] = 'A'; //用数组的方式处理
cout << s <
return 0;
}
运行结果
145e2fa34d172ae9b43a0df9e0ca74be.png运行结果

3 适合string类型操作的函数

  • substr()主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。
  • append() 方法在被选元素的结尾(仍然在内部)插入指定内容。提示:如需在被选元素的开头插入内容,请使用prepend()方法。
  • replace() 该函数返回一个字符串,其中指定的字符串已经被替换为另一字符串,并且替换的次数也可以指定。
代码实例:
#include 
#include
using namespace std;
//2020.05.27 测试字符串操作
int main()
{
string s("Hello world");
string s2 = s.substr(6,5); //从第6个开始取5个
cout << s2 << endl ; //s2为world
s2 = s.substr(6); //从第6个开始取拷贝所有的
cout << s2 << endl ; //s2为world
s2 = s.substr(6); //s2拷贝s的全部,相当于s2=s
cout << s2 << endl ; //s2为Hello world
s = "C++ Primer";
s.append(" 3rd Ed"); //再s最后添加3rd Ed
cout << s<< endl ; //s为C++ Primer 3rd Ed
s = "C++ Primer";
s.insert(s.size()," 3rd Ed"); //最后插入
cout << s<< endl ; //s为C++ Primer 3rd Ed
s.replace(11,3,"4th"); //下标11开始3个替换4th
cout << s<< endl ; //s为C++ Primer 4th Ed
s.replace(11,3,"Fourth"); //下标11开始3个替换Fourth
cout << s<< endl ; //s为C++ Primer Fourth Ed
s = "C++ Primer 3rd Ed"; //replace相当于先删除后插入
s.erase (11,3); //删除3rd
s.insert(11,"Fourth"); //插入Fourth
cout << s<< endl ; //s为C++ Primer Fourth Ed
return 0;
}
运行结果
cfb00e9a8d289b4939d2313257d0b2a9.png运行结果

4 string类型的查找

查找函数说明
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 的字符
代码实例
#include 
#include
using namespace std;
//2020.05.27 测试字符串操作
int main()
{
string name("AnnaBelle");
string::size_type pos1 = name.find("Bell");
cout << pos1 << endl; //返回下标4,如果没找到返回npos
if(pos1 == string::npos)
cout << "没找到!" << endl;
else
cout << "找到了!下标:" << pos1 <
name = "2sn3";
string numerics("0123456789");
string::size_type pos = name.find_first_of(numerics); //在2sn3中查找0123456789中任意一个第一次出现
if(pos == string::npos)
cout << "没找到!" << endl;
else
cout << "找到了!下标:" << pos <
//其他类型的查找这里就不举例子了
return 0;
}
运行结果
103955d88129102e819ce60a5f3d409d.png运行结果

5 string对象的比较

string对象比较函数compare用法说明
str1.compare(str2);如果相等则输出为0,str1>str2输出大于0,否则,输出小于0
str1.compare(m,n,str2);str1的子串(从索引m开始,包含n个字符)与str2进行比较
str1.compare(m,n,str2,m,n);str1的子串(从索引m开始,包含n个字符)与str2的子串(从索引m开始,包含n个字符)进行比较
代码实例:

#include
#include
#include
using std::cout;
using std::endl;
using std::cin;
using std::string;
int main(void)
{
string str1="hi,test,hello";
string str2="hi,test";
//字符串比较
if(str1.compare(str2)>0)
printf("str1>str2\n");
else if(str1.compare(str2)<0)
printf("str1 else
printf("str1==str2\n");
//str1的子串(从索引3开始,包含4个字符)与str2进行比较
if(str1.compare(3,4,str2)==0)
printf("str1的指定子串等于str2\n");
else
printf("str1的指定子串不等于str2\n");
//str1指定子串与str2的指定子串进行比较
if(str1.compare(3,4,str2,3,4)==0)
printf("str1的指定子串等于str2的指定子串\n");
else
printf("str1的指定子串不等于str2的指定子串\n");
//str1指定子串与字符串的前n个字符进行比较
if(str1.compare(0,2,"hi,hello",2)==0)
printf("str1的指定子串等于指定字符串的前2个字符组成的子串\n");
else
printf("str1的指定子串不等于指定字符串的前2个字符组成的子串\n");
return 0;
}
运行结果
ac670fa7f547414297273bdd76bad293.png运行结果
本文授权转载自公众号“C语言与CPP编程”,作者自成一派123

-END-

推荐阅读

【01】C语言十大经典排序算法(动态演示+代码,值得收藏)【02】C语言、嵌入式中几个非常实用的宏技巧【03】C语言最全入门笔记【04】绝对能检测你C语言基础水平的5个面试题【05】C语言为何不会过时?你需要掌握多少种语言?免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除b1ce11a64b9288168a60901fc3b51309.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给Hangfire的webjob增加callback和动态判断返回结果功能设计

背景介绍通常业务中需要用到定时执行功能&#xff0c;我用hangfire搭建了一个调度服务&#xff0c;这个调度服务是独立于业务逻辑的&#xff0c;具体可以参考文章&#xff1a;https://github.com/yuzd/Hangfire.HttpJob/wiki也就是说只要我有了这个调度服务后&#xff0c;只要提…

C++实现双向链表

#include <iostream> using namespace std; typedef int ElemType;typedef struct DuLNode {//节点的创建ElemType data;struct DuLNode *prior, *next; } DuLNode, *DuLinkList;bool InitList(DuLinkList &L) {//初始化L new DuLNode;if (L NULL) {cout << …

word List32

word List32 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

spring aop实例讲解_Spring框架核心知识点

文章内容输出来源&#xff1a;拉勾教育Java高薪训练营前言&#xff1a;由于工作需要提升自身技术能力&#xff0c;在各方比较下&#xff0c;报名了拉勾教育的java高薪训练营&#xff0c;目前已经学了半个月啦&#xff0c;来说说自身学习的感受吧&#xff1a;课程内容有广度更有…

word List 33

word List 33 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

深入理解ASP.NET Core依赖注入

概述ASP.NET Core可以说是处处皆注入&#xff0c;本文从基础角度理解一下原生DI容器&#xff0c;及介绍下怎么使用并且如何替换官方提供的默认依赖注入容器。什么是依赖注入百度百科中对于依赖注入的定义&#xff1a;控制反转&#xff08;Inversion of Control&#xff0c;缩写…

word List 34

word List 34 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

redis api 中文文档_我的Redis学习资料库

最近经常有人问我&#xff0c;我这边学习Redis都有哪些资料&#xff0c;能不能发他们一下。作为一个习惯”慢慢啃”技术学习的人&#xff0c;我确实积累了大量资料&#xff0c;这里可以介绍给大家。注明&#xff1a;本文提供的书籍、视频、源码、文档等&#xff0c;都是非盈利性…

前后端分离架构一直没机会实战?1周完成Vue+Core WebApi移动商城实战(含源码)!...

疫情让企业受到重创&#xff01;就业形势更加严峻&#xff01;前后端分离架构成了当下最高频的招聘需求还没实战过前后端分离&#xff1f;花3分钟阅读本文&#xff0c;带你全面了解前后端分离&#xff0c;轻松面试拿高薪&#xff01;Web发展至今技术非常成熟&#xff0c;主流有…

算法---宝藏最优选择问题

贪心算法—宝藏最优选择问题 原理参考趣学算法 代码&#xff1a; #include"quickSort1.h" 快速排序代码 int quickSort1(int a[], int l, int h) {//快速排序int i l, j h, p a[l];while (i < j) {while (i<j&&a[j]>p) {//从右往左遍历查找比…

C# 的未来:主构造函数

我们上次提到主构造函数是 2014 年&#xff0c;当时&#xff0c; C# 6 和 VB 12 的候选列表上去掉了主构造函数。去年底&#xff0c;主构造函数重新出现&#xff0c;作为提案#2691 &#xff0c;现在成为 C# 9 的一个候选项。主构造函数背后的基本思想是减少初始化类所需的样板代…

python unpack_ip地址处理每天10行python代码系列

背景知识:ip地址(这里都是指的ipv4地址)是一个32位(4字节)的无符号整数。为方便记忆&#xff0c;把每个字节看做一个无符号数&#xff0c;并以.号隔开。比如常见的私有地址192.168.100.1, dns 114.114.114.114。下面这段代码&#xff0c;展示python如何处理ip地址的一些方法。i…

word List35

word List35 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

exceptionhandler注解_SpringMVC 中 @ControllerAdvice 注解的三种使用场景!

ControllerAdvice &#xff0c;很多初学者可能都没有听说过这个注解&#xff0c;实际上&#xff0c;这是一个非常有用的注解&#xff0c;顾名思义&#xff0c;这是一个增强的 Controller。使用这个 Controller &#xff0c;可以实现三个方面的功能&#xff1a;全局异常处理全局…

在家做科研是一种什么样的体验?

匿名提问&#xff1a;题主是 MSRA 的一名实习生&#xff0c;大四。在家咸鱼了半个月&#xff0c;这周打算督促自己继续科研&#xff01;&#xff08;再不火力全开对不起公司不停发的工资和房补&#xff09;。可是在家里似乎很难静下心读 paper&#xff0c;工作五分钟就可以奖励…

word List36

word List36 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

C++实现链式存储二叉树

#include <iostream> using namespace std; typedef char ElemType;typedef struct BiNode {//节点的创建ElemType data;struct BiNode *lchild, *rchild; } BiNode, *BiTree;void PreOrderTraverse(BiTree T) {//先序遍历if (T) {cout << T->data;PreOrderTrav…

37岁跳槽去阿里 p8_36岁阿里p8发帖:手下12个p7,17个p6,亲自写代码毫无中年危机...

关注微信公众号【程序员干货站】&#xff0c;可加入技术交流群~程序员热议的“35 岁中年危机”&#xff0c;其实很多人都没搞懂本质上是因为什么而焦虑。最近看脉脉上有阿里员工发帖称&#xff1a;“今年36岁&#xff0c;p8&#xff0c;手下29个人&#xff0c;12个p7,17个p6&am…

数据结构---判断一棵树是否是二叉搜索树

数据结构—判断一棵树是否是二叉搜索树 代码&#xff1a; #pragma once #define N 100 #define elemType BTree* #include<stdlib.h> typedef struct BTree {int data;struct BTree *lchild, *rchild; }BTree; typedef struct dQueue {elemType data;struct dQueue* ne…

【要闻】Kubernetes安全问题严峻、Linux v5.4安全性浅谈

以下为您奉上今天的开源领域要闻。谷歌提前发布Android 11首个开发者预览版谷歌通常会在三月推出即将发布的Android预览版本。但谷歌今年更早实现了该功能&#xff0c;现已发布了Android 11首个开发者预览版&#xff0c;目前仅支持部分Pixel手机。今年的重点是开发人员部分&…