C++STL中string详解(零基础/小白,字符串)

目录

1. 基本概念:

1.1 本质:

1.2 string和char*区别:

1.3 特点:

2. 构造函数(初始化)

3. 赋值操作

4. 字符串拼接

5 查找 和 替换

6. 字符串比较

7. 字符存取

8. 插入和删除

9. 子串获取


1. 基本概念:

1.1 本质:

        string是C++风格的字符串,而string本质是一个类。

1.2 string和char*区别:

        char* 是一个指针。

        string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。

1.3 特点:

        string类内部封装了很多成员方法。

        例如:查找:find,拷贝copy,删除delete,替换replace,插入insert

        string管理char*所分配的空间,不用担心赋值越界和取值越界的问题,有类内部负责。

2. 构造函数(初始化)

        接下来都是先展示一下函数原型,具体如何操作将展示在代码中,如果看不懂函数原型,不要紧,直接看代码展示即可,学会怎么使用才是关键。当然要不需要去背,使用多了,自然记住了,并且记住的就是那些经常被使用的重要的。

初始化:

1. string();        //创建一个空的字符串

2. string(const char* s);            //使用字符串s初始化

3. string(const sting& str);        //使用一个string对象初始化另一个string对象

4. string(int n ,char c);              //使用n个字符c初始化

	// 第一种方法 创建空字符串
    string s1;	

	//第二种    使用字符串s初始化string对象
	const char* s = "hello world";
	string s2(s);
	cout << s2 << endl;

	//第三种    使用一个string对象初始化另一string对象
	string s3(s2);
	cout << s3 << endl;

	//第四种    将string初始化为n个字符c
	string s4(10, 'a');
	cout << s4 << endl;

        

3. 赋值操作

赋值操作 : 给string字符串进行赋值
        一类:
            string& operator = (const char* s);
            string& operatot = (const string& s);
            sting&    operator = (char c);

        
        二类:

            string& assign(const string& s);
            string& assign(const char* s);
            string& assign(const char* s,int n);
            string& assign(int n,char c);

//一类:
	//1.1
	string s1;
	s1 = "hello";
	cout << s1 << endl;

	//1.2
	string s2;
	s2 = s1;
	cout << s2 << endl;

	//1.3
	string s3;
	s3 = 'c';
	cout << s3 << endl;


//二类:
	//2.1
	string s4;
	s4.assign(s1);
	cout << s4 << endl;

	//2.2
	string s5;
	s5.assign("hello");
	cout << s5 << endl;

	//2.3
	string s6;
	s6.assign("hello", 3);
	cout << s6 << endl;

	//2.4
	string s7;
	s7.assign(5, 'h');
	cout << s7 << endl;

        其实初始化和赋值大部分都比较相似,熟悉了另一种就比较容易了。

        对于是否要全部掌握,= 和 assign函数,其实并不需要担心,目前你先只要熟练掌握其中一种就好了。

4. 字符串拼接

拼接操作 :  实现在字符串末尾拼接字符串
        一类:
        string& operator += (const char* s);
        string& operator += (const char c);
        string& operator += (const string& str);

        
        二类:
        string& append(const char* s);
        string& append(const char* s,int n);
        string& append(const string& str);
        string& append(const string& str,int pos,int n);

//第一类:
	//1.1
	string s1;
	s1 += "hello ";
	cout << s1 << endl;

	//1.2
	s1 += 'C';
	cout << s1 << endl;

	//1.3
	string s2 = " !";
	s1 += s2;
	cout << s1 << endl;

//第二类:
	//2.1
	string s3 = "hello  ";
	s3.append("world");
	cout << s3 << endl;

	//2.2
	s3.append(s2);
	cout << s3 << endl;

	//2.3 
	s3.append("and C++", 7);
	cout << s3 << endl;

	//2.4
	s3.append(s1, 0, 5);
	cout << s3 << endl;

5 查找 和 替换

查找:查找指定字符串是否存在
        ——find 和 rfind的区别 :find从左往右查找,rfind从右往左查
        int find(const string& str,int pos);    查找str第一次出现的位置,从pos位置开始查找
        int find(const char* s,int pos);    查找s第一次出现的位置,从pos位置开始查找
        int find(const char* s,int pos,int n);    从pos位置查找s的前n个字符第一次位置
        int find(const char c,int pos);    查找字符c第一次出现的位置,从pos位置开始

替换:在指定的位置替换字符串
        string& replace(int pos,int n,const string& str);
        string& replace(int pos,int n,const char* s);

        这里我们并不会对所有的接口函数进行实现,只要把最常用的和一些需要注意的介绍一下,其他的留给你自己来实验。

        1. find查找字符或字符串:

        如果想从0位置开始,即pos=0,是可以省略的。

string str = "hello"
int pos1 = str.find("hel");
int pos2 = str.find('o');

        2. find从pos位置开始查找s的前n个字符出现的第一个位置

string str("hello string !");
int pos1 = str.find("strnig",0,3);
int pos2 = str.find("strnig",0,6);
cout<<pos1<<endl;
cout<<pos2<<endl;

        这里pos1为s的位置,而pos2为-1,因为str中没有strnig这个字符串,其中根本原因是n的不用,strnig这个字符串只有前3个字符出现在str中。

        3. replace替换字符串

string str1 = "hello world";
str1.replace(6,3,"C++");

string str2 = "hello world";
str2.replace(6,5,"C++");

        这里替换就是将前n个元素替换成新的字符串,新的字符串不受n的影响,n只影响被替换的字符个数。当n=0时,在pos位置插入。

6. 字符串比较

比较方式:字符串比较是按字符的ASCII码进行对比

= 返回 0

> 返回 1

< 返回 -1

int compare(const string& str) ;

int compare(const char* s);

	string str1 = "hello";
	string str2 = "world";
	int com1 = str2.compare(str1);
	cout << com1 << endl;

	int com2 = str1.compare(str2);
	cout << com2 << endl;

7. 字符存取

string中单个字符存取方式有两种:

char& operator[](int n);        //通过[]防水取字符

char& at(int n);                //通过at方法获取字符

string str = "hello";
str[0] = 'w';
cout << str << endl;
str.at(0) = 'h';
cout << str << endl;

8. 插入和删除

插入:
string& insert(int pos,const char* s);        //插入字符串
string& insert(int pos,const string& str);        //插入字符串
string& insert(int pos,int n,char c);        //在指定位置插入n个字符c

删除:

string& erase(int pos,int n)           //删除从pos位置开始的n个字符

    string str1 = "hello ";
	str1.insert(6, "world");
	cout << str1 << endl;

	string str2 = " !";
	str2.insert(0, str1);
	cout << str2 << endl;

	string str3;
	str3.insert(0,3, 'a');
	cout << str3 << endl;

	str3.erase(0, 1);
	cout << str3 << endl;

9. 子串获取

从字符串中获取想要的子串

string substr(int pos,int n);        //返回由pos开始的n个字符组成的字符串

	string str = "abcdef";

	string substr = str.substr(1, 3);

	cout << "substr = " << substr << endl;


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch从零开始实战13

Pytorch从零开始实战——ResNet与DenseNet探索 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet与DenseNet探索环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;P…

搭建你的知识付费小程序平台:源码解析与技术实现

知识付费小程序平台在当今数字化时代扮演着越来越重要的角色&#xff0c;为教育者和学习者提供了一个灵活、便捷的学习环境。本文将以关键词“知识付费小程序源码”为基础&#xff0c;探讨如何搭建一个功能强大的知识付费小程序平台&#xff0c;并提供一些基础的技术代码示例。…

iClient3D 图元操作

1. S3MTilesLayer&#xff0c;S3M(Spatial 3D Model)图层类 S3MTilesLayer&#xff0c;S3M(Spatial 3D Model)图层类&#xff0c;通过该图层实现加载三维切片缓存&#xff0c;包括倾斜摄影模型、BIM模型、点云数据、精细模型、矢量数据、符号等。 那S3MTilesLayer中针对图元的…

vue2 tailwindcss jit模式下热更新失效

按照网上教程安装的tailwindcss&#xff0c;但是修改类名后热更新的时候样式没有生效&#xff0c;参考了大佬的文章&#xff0c;解决了该问题。 安装cross-env 修改前 "dev": " vue-cli-service serve", 修改后 "dev": "cross-env TAILWIN…

MYSQl基础操作命令合集与详解

MySQL入门 先来个总结 SQL语言分类 DDL&#xff08;Data Definition Language&#xff09; - 数据定义语言: 用于定义和管理数据库结构&#xff0c;包括创建、修改和删除数据库对象。 示例&#xff1a;CREATE, ALTER, DROP等语句。 DML&#xff08;Data Manipulation Lan…

Axios入门案例——后端学习

目录 后端准备 导入依赖 解决跨域 User实体类 DemoController测试接口 前端准备 项目结构 axios.js axios.html 开始测试 后端结果 前端结果 后端准备 导入依赖 案例会用到以下的三个依赖。 <dependency><groupId>org.springframework.boot</gro…

nginx反向代理实践指南:访问Tomcat

目录 前言1 实现的效果2 访问流程分析3 安装tomcat并测试4 配置4.1 在Windows系统的hosts文件进行域名和IP对应关系的配置4.2 在NGINX进行请求转发的配置&#xff08;反向代理配置&#xff09; 5 最终测试结论 前言 从Windows系统访问Tomcat Web应用程序&#xff0c;设置和配置…

mybatisplus使用雪花id通过swagger返回ID时精度丢失问题

在使用mybatisplus自带雪花的时候会发现返回的ID是19位的长度&#xff0c;因此在通过swagger页面展示的时候会发现后端返回的和页面展示的ID不一致问题。是因为精度丢失的问题。因此需要更改雪花ID的长度跟踪进去&#xff1a;发现是DefaultIdentifierGenerator类实现了Identifi…

STP笔记总结

STP --- 生成树协议 STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;是根据 IEEE802.1D标准建立的&#xff0c;用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路&#xff0c;并有选择地对某些端口进行阻…

pytest + yaml 框架 -60.git+jenkins+allure+钉钉通知反馈

前言 当我们自动化用例写完后&#xff0c;接下来就是如何运行用例&#xff0c;生成报告以及反馈通知了。 如果你们公司已经有jenkins了&#xff0c;那么直接集成到jenkins上构建你的自动化任务是非常方便的。 用例上传git仓库 第一步&#xff0c;将写好的自动化用例&#xf…

IDEA设置查看JDK源码

问题 我们在查看JDK源码时&#xff0c;可能会遇到这种情况&#xff0c;步入底层查看JDK源码时&#xff0c;出现一堆var变量&#xff0c;可读性非常之差&#xff0c;例如笔者最近想看到nio包下的SocketChannelImpl的write方法&#xff0c;结果看到这样一番景象&#xff1a; pu…

3小时快速入门自动化测试 —— Selenium测试工具

自动化测试 自动化测试简单来说就是利用自动化测试工具和自动化测试脚本来完成指定的测试任务&#xff0c;测试启动过程无需人工参与&#xff0c;但自动化测试之前的准备工作需要人工手动配置好。它是一种将重复性、繁琐的测试任务交给计算机自动执行的方法&#xff0c;能够显…

多条件三元表达式如何写?

在某些业务需求情况下&#xff0c;如何书写多条件三元表达式&#xff1f;&#xff08;例如&#xff0c;父组件传值给子组件&#xff0c;子组件根据不同的值去响应不同的颜色变化该如何实现&#xff1f;&#xff09; 父组件&#xff1a; 父组件传testData的值给子组件&#xff…

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题 Idea 在升级了2023.3以后&#xff0c;Jrebel 无法以 debug 的模式启动&#xff0c;找了半天&#xff0c;最后在插件主页的评论区找到了解决方案 特此记录一下

Springboot+vue的公寓报修管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的公寓报修管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的公寓报修管理系统&#xff0c;采用M&#xff08;model&…

HarmonyOS使用HTTP访问网络

HTTP数据请求 1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富、更加实用的体验。 那么要实现这样一种…

Android 12.0 Launcher3定制化之动态时钟图标功能实现

1.概述 在12.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…

Gartner发布2024年网络安全预测一:人工智能与网络安全将颠覆转化为机遇

Gartner 预测人工智能将以积极的方式持久地破坏网络安全&#xff0c;但也会造成许多短期的幻灭。安全和风险管理领导者需要接受 2023 年只是生成式 AI 的开始&#xff0c;并为其演变做好准备。 主要发现 生成式人工智能 (GenAI) 是一系列公认的颠覆性技术中的最新技术&#xff…

nodejs+vue+微信小程序+python+PHP全国天气可视化分析系统-计算机毕业设计推荐

3.2.1前台用户功能 前台用户可分为未注册用户需求和以注册用户需求。 未注册用户的功能如下&#xff1a; 注册账号&#xff1a;用户填写个人信息&#xff0c;并验证手机号码。 浏览天气资讯&#xff1a;用户可以浏览天气资讯信息详情。 已注册用户的功能如下&#xff1a; 登录&…

安装统信UOS服务器操作系统1060

原文链接&#xff1a;安装统信UOS服务器操作系统1060 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是如何安装统信UOS服务器操作系统1060。统信UOS是一款基于Linux内核&#xff0c;专为中国市场定制开发的操作系统。它不仅提供了良好的用户体验&#xff0c;还在…