C++字符串操作【超详细】

零.前言

本文将重点围绕C++的字符串来展开描述。

其中,对于C/C++中字符串的一些区别也做出了回答,并对于C++的(string库)进行了讲解,最后我们给出字符串的不同表达形式

开发环境

VS2022

一.字符串常量跟字符串变量

1.1字符串常量

字符常量是什么呢?顾名思义就是一段已经在内存中确定下来的字符串,并且这块内存中的字符串无法改变。

例如:"ABC"、"ASD233"、"sdasd16.."等等都是字符串常量

在C++中使用:

#include<iostream>
using namespace std;

int main()
{
	cout << "abc" << "是一个字符串常量" << endl;	//abc是一个字符串常量
}

1.2字符串变量:

对于字符串变量,在C++中有三种实现方式:“数组”、“指针变量”、“string类对象”。

数组:

#include<iostream>
using namespace std;

int main()
{
	char eg1[10] = "abc";    //直接初始化
	char eg2[10];    //后面通过输入初始化
	cin >> eg2;	//此处输入def
	cout << eg1 << endl;	//abc
	cout << eg2 << endl;	//def
}

运行结果:

指针变量:

#include<iostream>
using namespace std;

int main()
{
	char eg1[10] = "abc";	//数组
	char *eg2 = eg1;		//指针变量
	cout << eg1 << endl;	//abc
	cout << eg2 << endl;	//abc
}

运行结果:

string类对象:

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

int main()
{
	string s1 = "123";	//利用“=”来初始化
	string s2("456");	//利用“()”来初始化,和上面本质一样
	string s3 = s1;		//利用“string”类对象来初始化
	string s4(s2);		//和上面本质一样
	char eg[10] = "abc";
	string s5 = eg;		//利用“eg数组”来初始化
	cout << s1 << endl;	//123
	cout << s2 << endl;	//456
	cout << s3 << endl;	//123
	cout << s4 << endl;	//456
	cout << s5 << endl;	//abc
}

运行结果:

二.字符串的读取

为方便起见,后续的所有字符串都将以string类对象的形式进行讲解。

2.1cin函数

没啥好说的,最简单也是最开始学习到的读取函数,可以读取字符串,遇到“空格”、“回车”、“Tab”等制表格符号结束读取。

ps:不会读取空格,空格并不会被存储!!!

例如:

#include<string>
using namespace std;

int main()
{
	string s;
	cin >> s;	//在这里输入ABC
	cout << s << endl;	//输出ABC
	cin >> s;	//在这里输入A B C
	cout << s << endl;	//输出A
}

运行结果:

 2.2getline()函数

getline函数相对于cin函数最大的区别在于“getline可以读取空格,遇到回车才结束

getline()函数格式:

getline(cin,变量名)

例如:

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

int main()
{
	string s;
	getline(cin, s);	//这里输入A B C D
	cout << s << endl;	//输出A B C D
}

运行结果:

2.3cin.getline()函数

cin.getline()函数可以理解为是getline()函数的“超集”。

getline函数读取的是“string流(字符串流)”。

cin.getline函数读取的是“iostream流(输入输出信息流)”。

cin.getline函数遇到“空格”也会读取,不过跟getline函数最大的区别是“cin.getline()”函数可以指定读取的字符个数!!

cin.getline()函数格式:

cin.getline(变量名,读取字符的个数,结束字符)

其中,前两个参数必须有,第三个参数可以没有,默认为'\0'

PS:"cin.getline()函数只能给'数组'形式的字符串使用,而getline()函数只能给'string类对象'形式的字符串使用"

例如:

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

int main()
{
	char s[10];
	cin.getline(s,3);	//输入ABCD
	cout << s << endl;	//输出AB,原因在于最后一个字符存储了'\0',因此把C挤掉了。
}

运行结果:

getline()cin.getline()错误示例

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

int main()
{
	char eg1[10];
	string eg2;
	cin.getline(eg2, 5);	//报错,cin.getline()函数只能给'数组'形式字符串使用
	getline(eg1);			//报错,getline()函数只能给'string类对象'形式字符串使用
}

三.string类对象的操作

3.1string类对象字符串拼接、比较操作

"+"、">"、"<"、">="、"<="、"!="、"=="等符号在string类对象中都是允许的,具体规则如下:

"+":

"+"被用于两个字符串对象相加(首尾拼接)

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

int main()
{
	string s1 = "ABC";
	string s2 = "DEF";
	cout << s1 + s2 << endl;	//输出ABCDEF
}

"=="、"!=":

"=="被用于比较两个字符串是否相等(区分大小写、区分位置)
 

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

int main()
{
	string s1 = "ABC";
	string s2 = "ABC";
	string s3 = "abc";
	string s4 = "CBA";
	if(s1 == s2)
		cout << "s1,s2两个相等" << endl;
	else
		cout << "s1,s2两个不相等" << endl;
	//输出相等
	if(s1 == s3)
		cout << "s1,s3两个相等" << endl;
	else
		cout << "s1,s3两个不相等" << endl;
	//输出不相等
	if(s1 == s4)
		cout << "s1,s4两个相等" << endl;
	else
		cout << "s1,s4两个不相等" << endl;
	//输出不相等
}

运行结果:

"!="被用来比较两个字符串是否“不相等”(区分位置、区分大小写

道理和上面的"=="一样,在这里就不赘述了。

">"、"<"、">="、"<=":

这四个符号用来给字符串进行大小比较(依照字典序进行比较)

字典序:

a > b >c > ... > z > A > B > C > ... > Z

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

int main()
{
	string s1 = "aB";
	string s2 = "AB";
	if (s1 > s2)
		cout << "s1>s2" << endl;
	else
		cout << "s1<s2" << endl;
	//输出s1>s2
}

ps:“按照字典序从第一个位置开始挨个比较

例如“bA”大于“Ba”,那是因为b在第一个位置并且大于B,尽管后面的A小于a,但那是第二个位置了。

位置的优先级 > 字典序的优先级

3.2string类对象常见函数

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

int main()
{
	string s = "ABC";
	cout << s.empty() << endl;	//判断s是否为空,为空返回Ture(1),不为空返回False(0)
	cout << s.length() << endl;	//计算s的字符串长度
	cout << s.size() << endl;	//同上
	cout << s[2] << endl;	//跟字符数组一样,利用下标索引访问字符串中某个字符
	cout << s[3] << endl;	//空字符也是存在的,这里就输出空字符'\0'
	//运行结果//
    0
    3
    3
    C
    '\0',其实这个空字符在cmd命令控制窗口中就是一个空白.
}

运行结果:

 3.3修改string类对象的操作

3.3.1insert函数->插入:

s.insert(pos,k):

在字符串s下标索引pos之前插入字符串k

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

int main()
{
	string s = "ABC";
	s.insert(2, "66");
	cout << s << endl;	//输出AB66C
}

 3.3.2erase函数->删除:

erase(pos,len):

删除从 pos 开始的 len 个字符(包括位置pos)。如果 len 省略,则删除 pos 开始的后面所有字符。

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

int main()
{
	string s = "ABCDEF";
	s.erase(2, 2);
	cout << s << endl;	//输出ABEF
}

3.3.3replace函数->替换:

s.replace(start,len,rp):

将字符串s中下标索引start开始共len个字符替换为字符串rp

其中,删除的字符数量可以和要替换的字符串rp长度不一致

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

int main()
{
	string s = "ABCD";
	s.replace(1, 2, "6666");
	cout << s << endl;	//输出A6666D
}

3.3.4find函数->查找:

s.find(st):

在字符串s中查找字符串st第一次出现的位置,返回下标索引。

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

int main()
{
	string s = "ABCDEFAB";
	cout << s.find("AB") << endl;	//输出0
}

 3.3.5rfind函数->查找:

s.rfind(st):

在字符串s中查找字符串st最后一次出现的位置,返回下标索引。

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

int main()
{
	string s = "ABCDEFAB";
	cout << s.rfind("AB") << endl;	//输出6
}

3.3.6reverse函数->反转字符串:

s.reverse(start,end):

将字符串s下标索引[start,end]之间的字符串反转

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

int main()
{
	string s = "ABCDEF";
	reverse(s.begin(), s.end());
	cout << s << endl;	//FEFCBA
}

3.3.7substr函数->截取字符串:

s.substr(pos,len):

将字符串s从下标索引pos开始连续截取len个长度的字符串。

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

int main()
{
	string s = "ABCDEF";
	string ss = s.substr(1, 3);
	cout << ss << endl;	//BCD
}

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

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

相关文章

leetcode 热题 100_相交链表

题解一&#xff1a; 哈希表&#xff1a;两链表出现的第一个相同的值就是相交节点&#xff0c;因此我们先用哈希记录链表A所有出现过的值&#xff0c;再遍历链表B查找哈希表&#xff0c;找出第一个相同的值即为结果。 import java.util.HashSet;public class Solution {public …

如何使用Hexo搭建个人博客

文章目录 如何使用Hexo搭建个人博客环境搭建连接 Github创建 Github Pages 仓库本地安装 Hexo 博客程序安装 HexoHexo 初始化和本地预览 部署 Hexo 到 GitHub Pages开始使用发布文章网站设置更换主题常用命令 插件安装解决成功上传github但是web不更新不想上传文章处理方式链接…

【解读】OWASP 大语言模型(LLM)安全测评基准V1.0

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指参数量巨大、能够处理海量数据的模型, 此类模型通常具有大规模的参数&#xff0c;使得它们能够处理更复杂的问题&#xff0c;并学习更广泛的知识。自2022 年以来&#xff0c;LLM技术在得到了广泛的应…

ReactNative项目构建分析与思考之react-native-gradle-plugin

前一段时间由于业务需要&#xff0c;接触了下React Native相关的知识&#xff0c;以一个Android开发者的视角&#xff0c;对React Native 项目组织和构建流程有了一些粗浅的认识&#xff0c;同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测

多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测 目录 多维时序 | Matlab实现BiGRU-Mutilhead-Attention双向门控循环单元融合多头注意力机制多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 …

字典Trie树

字典树 : 概念 建字典树 查询 : 代码模板 : const int N100010; int n; char s[N]; int ch[N][26],cnt[N],idx;void insert(char *s){int p0;for(int i0; s[i]; i ){int js[i]-a;//字母映射if(!ch[p][j])ch[p][j]idx;pch[p][j];}cnt[p];//插入次数 } int query(char *s){i…

线上应用部署了两台load为1四核服务器

线上应用部署了两台服务器。 项目发布后&#xff0c;我对线上服务器的性能进行了跟踪&#xff0c;发现一台负载为3&#xff0c;另一台负载为1&#xff0c;其中一台四核服务器已经快到瓶颈了&#xff0c;所以我们紧急排查原因。 1、使用TOP命令查看占用CPU较大的负载和进程&…

《C语言都有哪些字符串处理函数?》

目录 17个字符串处理函数 1. gets()--读 2.fgets()--从指定文件内读 3.puts()--输出 4.fputs()--写入到指定文件中 5.strlen()--计算字符串长度 6.strcpy()--复制 7.strncpy()--复制前n个字符 8.strcat()--字符串连接 9.strncat()--将前n个字符连接 10.strcmp()--比…

Flink概述

1.什么是Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 官网&#xff1a;Flink 2.Flink的发展历史 Flink起源于一个叫作Stratosphere的项目&#xff0c;它是由3所地处柏林的大学和欧洲其他一些大学在2010~2014年共同进行的研究项目&a…

从零开始:神经网络(2)——MP模型

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 神经元相关知识&#xff0c;详见从零开始&#xff1a;神经网络——神经元和梯度下降-CSDN博客 1、什么是M-P 模型 人…

物联网云原生云边协同

文章目录 一、物联网平台设计1.物联网平台设计2.物联网平台实现 二、部署环境1.节点配置2.版本信息 三、物联网平台部署1.部署 Kubernetes 集群2.部署 KubeEdge3.部署 ThingsBoard 集群4.部署 ThingsBoard Edge4.1.创建 Edge 实例4.2.部署 PostgreSQL4.3.创建数据库4.4.部署 Th…

构建高效可靠的消息队列系统:设计与实现

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 一、引言 二、设计目标 2.1、高可用性 1. 集群搭建 1.1 …

MACBOOK PRO M2 MAX 安装Stable Diffusion及文生图实例

以前偶尔会使用Midjourney生成一些图片&#xff0c;现在使用的头像就是当时花钱在Midjourney上生成的。前段时间从某鱼上拍了一台性价比还不错的macbook&#xff0c;想着不如自己部署Stable Diffusion&#xff08;以下简称SD&#xff09;尝试一下。 网上有很多教程&#xff0c…

数组的内存执行原理

一.Java内存分配介绍 JVM虚拟机会在内存中执行程序 java内存分配介绍 方法区&#xff0c;栈&#xff0c;堆 首先将编译过后的.class文件送入方法区中。当类开始运行时将方法调入栈内存中&#xff0c;变量也是属于方法的&#xff0c;因此同方法一起进入栈内存中。当main方法要…

日期问题---算法精讲

前言 今天讲讲日期问题&#xff0c;所谓日期问题&#xff0c;在蓝桥杯中出现众多&#xff0c;但是解法比较固定。 一般有判断日期合法性&#xff0c;判断是否闰年&#xff0c;判断日期的特殊形式&#xff08;回文或abababab型等&#xff09; 目录 例题 题2 题三 总结 …

人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)

1.k-means聚类 1.1.算法简介 K-Means算法又称K均值算法&#xff0c;属于聚类&#xff08;clustering&#xff09;算法的一种&#xff0c;是应用最广泛的聚类算法之一。所谓聚类&#xff0c;即根据相似性原则&#xff0c;将具有较高相似度的数据对象划分至同一类簇&#xff0c;…

CentOS 7.6安装部署Seafile服务器

今天飞飞和你们分享CentOS 7.6上安装基于MySQL/MariaDB的Seafile服务器的方法&#xff0c;包括下载和安装7.0.5版本、配置数据库、启动服务器等步骤。安装成功后&#xff0c;需要通过nginx反向代理才能访问seafile服务。 通过预编译好的安装包来安装并运行基于 MySQL/MariaDB …

Day27:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

目录 TP框架-开发-配置架构&路由&MVC模型 TP框架-安全-不安全写法&版本过滤绕过 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技…

网络触手获取天气数据存入mysql 项目

首先这个案例不一定能直接拿来用&#xff0c;虽然我觉得可以但是里面肯定有一些我没考虑到的地方。 有问题评论或者私信我&#xff1a; 这个案例适合我这种学生小白 获取天气数据网址&#xff1a; https://lishi.tianqi.com/xianyang/202201.html 网络触手获取天气数据代码直…

Svg Flow Editor 原生svg流程图编辑器(二)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; 说明 这项目也是我第一次写TS代码哈&#xff0c;现在还被绕在类型中头昏脑胀&#xff0c;更新可能会慢点&#xff0c;大家见谅~ 目前实现的功能&#xff1a;1. 元件的创建、移动、形变&#xff1b;2…