String类——字符序列类(1)

news2024/11/27 12:47:44

目录      

前言

String类

1.该类的由来

2.String类对象的创建

(1)头文件

(2)类对象的创建

其他用法:

(3)String类对象遍历 

1:数组方式遍历

2.范围for遍历:

3.迭代器遍历:

总结:


前言

        在学习 C语言的过程中,我们对于字符的表示所使用数据类型用的是char,而字符串是字符的集合,需要用到字符数组或者指针两种方式,如下:

int main(){
char str[10]="123456";
char* std="Hello World";
}

         第一种方式字符数组,字符串数据被放在堆栈空间的,它是可读可写的,对于字符串,我们可以对它进行数据的修改,例如:求长度、拷贝字符串、拼接、比较多个字符串的大小、查找内容......:

# include<stdio.h>
#include<string.h>
int main() {
	char str[40] = "12345678";		//可修改
	//int length = sizeof(str) / sizeof(str[0]);
	//求字符串的长度
	int length = strlen(str);

    //遍历字符串
	for (int i = 0; i < length; i++) {
		printf("%c ", str[i]);
	}
	printf("\n");

	//字符串的拷贝
	char s1[15] = "haha";
	char s2[18] = "xixi";
	strcpy(s2, s1);
	printf("s2:%s\n", s2);

	//字符串的拼接
	char s3[6] = "789";
	strcat(s1, s3);
	printf("%s\n", s1);

	//字符串的查找
	char a[] = "abcdefg";
	char b[] = "bc";
	char* ret = strstr(a, b);	//在数组a中查找数组b的内容
	if (ret == NULL) {
		printf("Can not find!\n");
	}
	else {
		printf("%s\n", ret);  //输出 bcdefg
	}
	return 0;
}

测试结果: 

 

        通过代码我们可以发现字符串操作很繁琐,且字符数组在修改时还得时时刻刻注意数组是否会造成越界,表明char类型的字符数组无法自动分配内存空间。

        第二种就是指针指向字符串,对于此种方式,我们无法进行修改,因为字符串处在常量区。

        而在C++中,为了弥补C语言字符功能的不足,编程人员专门创建了String类,该类内部封装了与内存容量有关的信息,string对象自己就知道在内存的位置,包含的字符序列与长度;并且当自身存储空间不足时,会自动调整,让内存空间存储到能够容纳下所有字符序列的大小。


String类

1.该类的由来

        该类是根据utf-8编码为核心所制作的字符序列类,在学习C语言过程中,我们唯一熟悉的就是ASCII码,。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。因为计算机最开始是由美国发明创造的,所以有了ASCII码去划分字符,但后来计算机的广泛发展,各国都开始使用,但ASCII码远远不能满足,各国都有他们各自特殊的字符,所以Unicode诞生了。

        统一码(Unicode),也叫万国码、单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。统一码是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的美国标准信息交换代码,以满足跨语言、跨平台进行文本转换、处理的要求。

        而我们在各类语言中经常使用的就是utf-8编码,所以String类也是我们最常用的字符序列类。

2.String类对象的创建

(1)头文件

String类想要使用,就得包含头文件:#include<String>

String是char的优化类型,所以在C++中它是typedef代替而成的:

typedef basic_string<char>  string

 

(2)类对象的创建

        主要用法:

#include<iostream>
using namespace std;
int main() {
	//生成空字符串
	string str1;
	cout << str1 << endl;

	//生成字符串方法1:
	string str2("1234");
	cout << str2 << endl;

	//生成字符串方法2:
	string str3="5678";
	cout << str3 << endl;

	//生成字符串方法3:
	string str4(str3);
	cout << str4 << endl;

        总结:方法1和方法2虽然创建格式不同,但是等价的,方法1是对象str2拷贝字符串"1234",方法2是将字符串"5678"内容赋值给对象str3;

                  方法3和方法1都是用到类的拷贝构造函数,str4拷贝构造了str3的数据内容,但却是深拷贝,对象str4指向的字符串"5678"地址与str3指向的字符串地址不同!

其他用法:

        针对于拷贝字符串内容生成的方法,还需要注意以下几种情况:

情况1:

string str5("123456", 3, 2);
	cout << str5 << endl;

        str5生成方式:从字符串的某个下标位置开始,共获取n个字符;第一个参数是字符串,第二个参数指字符串的下标位置,第三个参数是需要输入获取的字符数。

        代码解析:在字符串内容的下标3位置开始获取2个字符数。

    string str5_1("123456", 3, 100);
	cout << str5 << endl;

        若是想要获取100个字符,会不会出现异常或者报错?

        答案是:不会,编译器在字符下标位置3处,也就是字符4处一直往后取,直到'\0'就自动结束获取,不会造成越界。

结果: 

 

情况2:

    string str6("987654", 2);		
	cout << str6 << endl;

	string str7("Hello World",10);	
	cout << str7 << endl;

        代码解析:str6获取从字符串"986754"中的两个字符内容,括号内只有两个形参,一个是字符串内容,一个是获取的字符数,那么下标位置默认是从字符串首部开始取! 

结果:

(3)String类对象遍历 

        遍历方式有三种:

1:数组方式遍历

int main() {
	string s = "123456";
	for (int i = 0; i < s.size(); i++) {
		s[i]++;    //让字符串s中的每个字符都加1,这个加1是编码+1(类似于Ascii+)
		cout << s[i]<<"  ";
	}

       注:String类中之所以能用数组循环的方式遍历,原因就在于[ ]这对方括号,在String类中,方括号被重载。

 

 


2.范围for遍历:

cout<<"遍历方法2:范围for:" << endl;
	for (auto& j :s ) {
		j--;
		cout << j <<"  ";
	}
	cout<<endl;

auto可以自动识别类型,使用引用&符号,可以修改数据。 

 

3.迭代器遍历:

        使用迭代器,需要明白其格式:

string:: iterator 迭代器对象名=String类对象.函数名(); 

 

正向迭代器:

 

cout << "遍历方式3:用迭代器iterator:" << endl;
string s2 = "20221213";
string::iterator it1 = s2.begin();
while(it1!=s2.end()){
	//写操作
	(*it1) += 1;
	//读操作
		cout << (*it1) << "  ";
		it1++;
		}

        iterator迭代器功能的使用需要 


 

反向迭代器:逆置遍历

注: rbegin与rend都是搭配reverse_iterator使用,且方向相反,迭代器对象也是++,不可--使用。

//反向迭代器
			string s4 = "WangKai";
			string::reverse_iterator rit1 = s4.rbegin();
			while (rit1 != s4.rend()) {
				cout << (*rit1) << "  ";
				rit1++;
			}
			cout << endl;

 

 


 const正向迭代器:不支持数据修改

string::const_iterator cit1 = s4.cbegin();
		while (cit1 != s4.cend()) {
			cout << (*cit1) << "  ";
			//(*cit1)++;	//报错
			cit1++;
			}
	

 

 cbegin与cend也是搭配const使用的。

 

const反向迭代器:不支持数据修改+逆置遍历

string::const_reverse_iterator rcit1 = s4.rbegin();
			while (rcit1 != s4.rend()) {
				cout << (*rcit1) << "  ";
				rcit1++;
			}
			cout << endl;

 

总结:

        1.const不可以放在string外面,const放在外面则是:

const string::iterator it=s1.begin();        该语句限制了it不能够移动位置,只能指向s1字符串的首部,无法进行遍历;

而string::const_iterator cit=s1.begin();        该语句则是限制了cit不能修改字符串的内容,cit还是可以继续移动进行遍历的

        2.可以缩写类型:转换成auto,auto具有自动识别数据的类型功能,所以:

 auto it=s1.begin();                auto rit=s1.rbegin();        auto cit=s1.cbegin();......   

        3.迭代器的对象是类似于指针形式的,通过迭代器进行的遍历需要其对象进行解引用才能实现遍历! 

 

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

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

相关文章

【Python】【期末复习题】【2022秋】

文章目录一、单选题&#xff08;20分&#xff09;二、判断题&#xff08;10分&#xff09;三、填空题&#xff08;10分&#xff09;四、问答题&#xff08;共30分&#xff0c;6题&#xff0c;每题5分&#xff09;五、程序题&#xff08;3题&#xff0c;每题10分&#xff0c;共3…

React.js 简介以及一些基本概念

React 是什么 React 跟angular.js 和Vue.js 一样是构建用户界面的js库 2011 年 由Facebook 工程师Jordan Walke创建 在 2013 开源 React 的优势 原生js的痛点 原生的Javascript 操作DOM繁琐&#xff0c;效率低(DOM-API 操作UI&#xff09;使用Javascript 直接操作DOM&#xf…

scala语法(三)(有java基础速学)

面向对象编程&#xff08;中&#xff09; scala的包 Scala中包名和源码所在的系统文件目录结构要可以不一致&#xff0c;但是编译后的字节码文件路径和包名会保持一致 scala 自动引入的包 Scala中&#xff0c;以下三个包的内容会隐式引用到每个程序上。 import java.lang._…

[附源码]Python计算机毕业设计二手交易平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

如何管理客商主数据,附要点和QA

客商主数据&#xff08;客户、供应商、既是客户也是供应商&#xff09;是企业最常用的主数据类型之一。要实现上下游的打通&#xff0c;方便企业内部相关业务的运转以及信息流通&#xff0c;做好客商主数据的管理至关重要。 什么是客商主数据 客商主数据是一类复杂的主数据&a…

一文搞懂Vue Diff算法

为什么需要diff算法&#xff1f; 对于一个容器&#xff08;比如我们常用的#app&#xff09;而言&#xff0c;它的内容一般有三种情况&#xff1a; 1.字符串类型&#xff0c;即是文本。 2.子节点数组&#xff0c;即含有一个或者多个子节点 3.null&#xff0c;即没有子节点 在…

【软件开发】前后端分离架构下JWT实现用户鉴权

前后端分离架构下JWT实现用户鉴权在【计算机网络】JWT&#xff08;JSON Web Token&#xff09;初识 中&#xff0c;我们讲解了 JWT 的基础知识。Token 验证的方式一般是用在前后端分离的软件开发项目中&#xff0c;所以本篇文章将会从前端和后端的角度去考虑 JWT 的实现。前端 …

H5和小程序的区别

近年来&#xff0c;由于社交电商的火爆程度&#xff0c;相较于传统的电商淘宝、京东、天猫这种第三方平台&#xff0c;其余平台的发展也势不可挡。并且第三方平台的竞争过大&#xff0c;成本过高&#xff0c;抢流量越来越难之后&#xff0c;越来越多的商家企业开始转战H5微商城…

基于知识图谱的多模内容创作技术

导读&#xff1a;由于大数据时代的发展&#xff0c;知识呈指数级增长&#xff0c;而知识图谱技术又在近年来逐步火热&#xff0c;因此诞生了利用知识图谱技术进行智能创作的新想法。本文将分享基于知识图谱的多模内容创作技术及应用。主要包括以下四大部分&#xff1a; 百度知识…

Network Configuration Manager固件漏洞管理

固件漏洞可能会使您的企业和客户的敏感数据面临风险&#xff0c;导致黑客容易进入、销售额下降、声誉损失和处罚。为了避免这些事故&#xff0c;识别这些固件漏洞并定期采取纠正措施非常重要。 使用 Network Configuration Manager&#xff0c;你现在可以识别网络设备中的潜在…

【数据结构-JAVA】包装类 泛型

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 1.3 一道面试题 2. 泛型 2.1 什么是泛型 3. 泛型是如何编译的 3.1 擦除机制 4. 泛型的上界 5. 泛型方法 1. 包装类 在 Java 中&#xff0c;由于基本类型不是继承自 Object&#xff0c;为了在泛型代码中可以…

为什么 FIQ 比 IRQ 的响应速度更快?

目录 1、FIQ在异常向量表位于最末 2、FIQ模式有5个私有寄存器 3、FIQ的优先级高于IRQ 1、FIQ在异常向量表位于最末 一般来说&#xff0c;处理器跳转到异常向量表以后&#xff0c;会根据当前的异常源类型&#xff0c;执行下一次的跳转指令&#xff0c;但是FIQ在异常向量表的…

尚医通:项目搭建-提交到Git(六)

&#xff08;1&#xff09;前后端概念介绍 &#xff08;2&#xff09;搭建项目后端环境 &#xff08;3&#xff09;提交到Git仓库 &#xff08;1&#xff09;前后端概念介绍 &#xff08;2&#xff09;搭建项目后端环境 项目模块构建 hospital-manage&#xff1a;医院接口模拟…

微服务框架 SpringCloud微服务架构 分布式缓存 44 Redis 分片集群 44.5 RedisTemplate访问分片集群

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式缓存 文章目录微服务框架分布式缓存44 Redis 分片集群44.5 RedisTemplate访问分片集群44.5.1 RedisTemplate访问分片集群44 Redis 分片…

手把手教你使用SpringBoot做一个员工管理系统【代码篇·上】

手把手教你使用SpringBoot做一个员工管理系统【代码篇上】1.登录功能2.登录拦截器的实现3.展示员工列表1.登录功能 首先把登录页面的表单提交地址写一个controller <form class"form-signin" th:action"{/user/login}">表单的name属性不可少&#…

13、腾讯云轻量应用服务器挂载文件系统

前言&#xff1a;腾讯云轻量应用服务器腾讯云文件存储&#xff08;Cloud File Storage&#xff0c;CFS&#xff09;系统的使用小记 轻量应用服务器系统版本是windows server 2012r 一、必要概念 1.1 轻量应用服务器 轻量应用服务器&#xff08;TencentCloud Lighthouse&#x…

【MySQL】浅谈事务与隔离级别

文章目录1. 事务概述2. 事务的特性3. 事务的隔离级别1. 事务概述 什么是事务&#xff1f; 在MySQL中的事务&#xff08;Transaction&#xff09;是由存储引擎实现的&#xff0c;在MySQL中&#xff0c;只有InnoDB存储引擎才支持事务。事务处理可以用来维护数据库的完整性&#x…

大数据学习--使用Java API访问HDFS

Java API访问HDFS编写Java程序访问HDFS1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、启动集群HDFS服务5、在HDFS上创建文件编写Java程序访问HDFS 1、创建Maven项目 创建Maven项目 - HDFSDemo 单击【Create】按钮 2、添加相关依赖 在pom.xml文件里添加hadoop和…

react的jsx和React.createElement是什么关系?面试常问

1、JSX 在React17之前&#xff0c;我们写React代码的时候都会去引入React&#xff0c;并且自己的代码中没有用到&#xff0c;这是为什么呢&#xff1f; 这是因为我们的 JSX 代码会被 Babel 编译为 React.createElement&#xff0c;我们来看一下babel的表示形式。 需要注意的是…

Kotlin 原生拓展函数与非拓展函数

先看一下图文 根据定义的性质可分为两类 非拓展函数 repeat 循环函数,可使用该函数执行一些有限循环任务,务必在构造函数传入循环次数 repeat(repeatNumber:Int 1) with 条件补充区域,可在某些需要两个或者多个函数对象直接的属性进行依赖操作时使用 …