C++ 字符串

news2024/11/13 22:46:47

在C语言中是使用字符型数组来存放字符串,C++程序也仍然可以沿用这种方法。不仅如此,C++库中还预定义了string类。

1.用字符数组存储和处理字符串

字符串常量是用一对双引号括起来的字符序列。例如"abcd","China"都是字符串常量。

字符串常量在内存中的存放形式:是按串中字符的排列次序顺序存放的,每一个字符占一个字节,并在末尾添加’\0’作为结尾标记。这实际上是一个隐含创建的类型为char的数组。一个字符串常量就表示这样一个数组的首地址。因此,可以把字符串常量赋给字符串指针,由于常量值不能修改,应将字符串常量赋值给指向常量的指针,例如:

const char*string1="This is a srting.";

这时可以直接对string1进行输出,例如:

cout<<string1;

字符串变量也可以用类似方式来表示。如果创建一个char数组,每个元素存放字符串的一个字符,在末尾放置一个’\0’,便构成了C++字符串。它的存储方式与字符串常量一样,但是由于它是程序员创建的数组,因此可以改写其内容,所以这就是字符串变量而非常量了。

这时要注意,用于存放字符串的数组其元素个数应该不小于字符串的长度(字符个数)加1。对字符数组进行初始化赋值时,初值的形式可以是以逗号分隔的ASCII码或者字符常量,也可以是整体的字符串常量(这时末尾’\0’是隐含的)。下面列出的语句都可以创建一个初值为"program"的字符串变量,3种写法是等价的:

char str[8]={'p','r','o','g','r','a','m','\0'};
char str[8]="program";
char str[]="program";

内存中数组str的内容如下:
在这里插入图片描述
尽管对用字符数组表示的字符串进行初始化比较容易、直观,但进行许多其他字符串操作时却比较麻烦。执行很多字符串操作需要借助cstring头文件中的字符串处理函数。例如,strcpy函数,strcmp函数,strcat函数。另外,当字符串长度很不确定时,需要用new来动态创建字符串数组,最后用delete释放。C++对这些繁琐的操作进行了封装,形成了string类,可以更加方便地操作字符串。

2. string类

C++标准库将面向对象的串的概念加入到C++语言中,预定了字符串类(string类)。string类提供了对字符串进行处理所需要的操作。使用string类需要包含头文件string。string封装了串的属性并提供了一系列允许访问这些属性的函数。

严格地说,string并非一个独立的类,而是类模板basic_string的一个特化实例。不过对于string的使用者来说,它的特点与一个类无异,因此可以把它当作一个类来看待。

(1)string类的构造函数原型
string();//默认构造函数,建立一个长度为0的串
string(const string &rhs);//拷贝构造函数

//将对象rhs中的串从位置pos开始取n个字符,用来初始化string类的对象
//注意:串中的第一个字符的位置是0
string(const string&rhs,unsigned int pos,unsigned int n);

//用指针s所指向的字符串中的前n个字符初始化string类的对象
string(const char*s,unsigned int n);

//将参数c中的字符重复n次,用来初始化string类的对象

由于string类具有接收const char*类型的构造函数,因此字符串常量和用字符串数组表示的字符串变量都可以隐含地转换为string对象。例如,可以直接使用字符串常量对string对象进行初始化:

string str="Hello World!";
(2)string类的操作符

string类提供了丰富的操作符,可以方便地完成字符串赋值(内容复制)、字符串连接、字符串比较等功能。
下表具体列出了string类的操作符及说明:
在这里插入图片描述
之所以能够通过上面的操作符来操作string对象,是因为string类对这些操作符进行了重载。

这里所说的对两个串的大小进行比较,是依据字典顺序的比较。
设有两个字符串s1和s2,二者大小比较的规则如下:
①如果s1和s2长度相同,且所有字符完全相同,则s1=s2。
②如果s1和s2所有字符不完全相同,则比较第一对不相同字符的ASCII码,较小字符所在的串为较小的串。
③如果s1的长度n1小于s2的长度n2,且两个字符串的前n1个字符完全相同,则s1<s2。

(3)常用成员函数

string类的成员函数有很多,每个函数都有许多重载形式。在下面的函数说明中,将成员函数所属的对象称为“本对象”,其中存放的字符串称为“本字符串”。

//将字符串s添加在本串尾:
string append(const char*s);

//赋值,将s所指向的字符串赋值给本对象
string assign(const char*s);

//比较本串与str中串的大小,
//当本串<str串时返回负数;
//当本串>str串时返回正数;
//两串相等时,返回0
int compare(const string&str)const;

//将s所指的字符串插入在本串中位置p0之前
string &insert(unsigned int p0,const char*s);

//取子串,取本串中位置从pos开始的n个字符,构成新的string类对象作为返回值
string substr(unsigned int pos,unsigned int n)const;

//查找并返回str在本串中第一次出现的位置
unsigned int find(const basic_string &str)const;

//返回串的长度(字符个数)
unsigned int length()const;

//将本串与str中的字符串进行交换
viod swap(string&str);

【例】string类应用举例

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

//根据value的值输出true或false,title为提示文字

inline void test(const char*title,bool value)
{
	cout << title << "returns  " << (value ? "true" : "false") << endl;
}

int main()
{
	string s1 = "DEF";
	cout << "s1为:" << s1 << endl;

	string s2;
	cout << "请输入s2:";
	cin >> s2;

	cout << "s2的长度为:" << s2.length() << endl;

	//比较运算符的测试
	test("s1<=\"ABC\"  ", s1 <= "ABC");
	test("\"DEF\"<=s1  ", "DEF" <= s1);

	//连接运算符测试
	s2 += s1;
	cout << "s2=s2+s1:" << s2 << endl;
	cout << "s2的长度为:" << s2.length() << endl;

	return 0;


	return 0;
}

运行结果:
在这里插入图片描述
上面的例子中使用cin的“>>”操作符从键盘输入字符串,以这种方式输入时,空格会被当作输入的分隔符。例如,如果从键盘输入字符串“123 ABC”,那么被读入的字符串实际上是“123”,“ABC”将在下一次从键盘输入字符串时被读入。例如,在上述代码运行结束时从键盘输入123 ABC,结果如下图所示:
在这里插入图片描述

如果希望从键盘读入字符串,直到行末为止,不以中间的空格作为输入的分隔符,可以使用头文件string中定义的getline。例如,如果将上述代码中输入s2的语句 cin >> s2;改写为getline(cin,s2);,这时,如果从键盘输入字符串123 ABC,那么整个字符串都会被赋给s2,结果如下图所示:
在这里插入图片描述
这实际表示输入字符串时只以换行符作为分隔符。getline还允许在输入字符串时增加其他分隔符,使用方法是把可以作为分隔符的字符作为第3个参数传递给getline。例如,如果在代码中将cout<<s2;改写为getline(cin,s2,',');,使用这个语句,可以把逗号作为分隔符,结果如下图所示:
在这里插入图片描述
从结果可以看出,在从键盘输入字符串的时候,不读入分隔符后边的字符串内容,只读入作为分隔符的字符前面的字符串。

【例】用getline输入字符串

#include<iostream>
#include<string>
using namespace std;
int main()
{
	for (int i = 0; i < 2; i++)
	{
		string str1, str2;
		getline(cin, str1, ',');
		getline(cin, str2);
		cout << "str1:" << str1 << "    str2" << str2 << endl;
	}
	return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

跨域+四种解决方法

文章目录 一、跨域二、JSONP实现跨域请求三、前端代理实现跨域请求四、后端设置请求头实现跨域请求五、Nginx代理实现跨域请求5.1 安装Nginx软件5.2 使用Ubuntu安装nginx 本文是在学习课程满神yyds后记录的笔记&#xff0c;强烈推荐读者去看此课程。 一、跨域 出于浏览器的同…

【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>

目录 【力扣】23. 合并 K 个升序链表题解方法一&#xff1a;暴力&#xff0c;先遍历取出来值到数组中排序&#xff0c;再生成新链表方法二&#xff1a;基础堆排序&#xff08;使用优先队列 PriorityQueue&#xff09;方法三&#xff1a;基础堆排序&#xff08;使用优先队列 Pri…

时序预测 | Matlab实现基于SVR支持向量机回归的电力负荷预测模型

文章目录 预测结果基本介绍程序设计参考资料预测结果 基本介绍 时序预测 | Matlab实现基于SVR支持向量机回归的电力负荷预测模型 支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给…

微信小程序nodejs+vue+uniapp个人家庭理财系统--论文

随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网上管理&#xff0c;它将是直接管理家庭理财系统app的最新形式。本论文是以构建家庭理财系统app为目标&#xff0c;使用nodejs技术制作&…

什么是Linux,如何在Windows操作系统下搭建Linux环境,远程连接Linux系统

文章目录 什么是LinuxLinux的诞生及发展为什么要学习LinuxLinux内核Linux发行版什么是虚拟机如何在VMware虚拟机中搭建Linux系统环境远程连接 Linux 系统Linux 帮助网站 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户…

概念解析 | PointNet概述

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次解析的概念是:点云深度学习及PointNet论文概述 参考论文:Qi C R, Su H, Mo K, et al. Pointnet: Deep learning on point sets for 3d classification and segmentation[C]//Proceedings of …

《向量数据库指南》——GPTCache 中的温度参数

目录 GPTCache 中的温度参数 a. 从多个候选答案中随机选择 b. 调整概率跳过缓存,直接调用模型 GPTCache 中的温度参数 为了平衡响应的随机性和一致性,并满足用户偏好或应用需求,在多模态 AI 应用中选择适当的温度参数值至关重要。GPTCache 保留了机器学习中温度参数的概…

Netty 粘包半包

什么是 TCP 粘包半包&#xff1f; 假设客户端分别发送了两个数据包 D1 和 D2 给服务端&#xff0c;由于服务端一次读取到的字节 数是不确定的&#xff0c;故可能存在以下 4 种情况。 &#xff08;1&#xff09;服务端分两次读取到了两个独立的数据包&#xff0c;分别…

kubernetes基于helm部署gitlab-operator

kubernetes基于helm部署gitlab-operator 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-operator。 先决条件 已运行的 Kubernetes 集群负载均衡器&#xff0c;为ingress-nginx控制器提供EXTERNAL-IP&#xff0c;本示例使用metallb默认存储类&#xff0c;为gitlab p…

ChatGPT“侵入”校园,教学评价体制受冲击,需作出调整

北密歇根大学的教授奥曼在学生作业中发现了一篇关于世界宗教的“完美论文”。“这篇文章写得比大多数学生都要好......好到不符合我对学生的预期&#xff01;”他去问ChatGPT&#xff1a;“这是你写的吗&#xff1f;”ChatGPT回答&#xff1a;“99.9%的概率是的。” ChatGPT“侵…

C++二叉搜索树剖析

目录 &#x1f347;二叉搜索树概念&#x1f348;二叉搜索树查找&#x1f349;二叉搜索树的插入&#x1f34a;二叉搜索树的删除&#x1f34d;二叉搜索树的查找、插入、删除实现&#x1f34b;二叉搜索树的应用&#x1f96d;二叉搜索树的性能分析&#x1f353;总结 &#x1f347;二…

Mac 创建和删除 Automator 工作流程,设置 Terminal 快捷键

1. 创建 Automator 流程 本文以创建一个快捷键启动 Terminal 的自动操作为示例。 点击打开 自动操作&#xff1b; 点击 新建文稿 点击 快速操作 选择 运行 AppleScript 填入以下内容 保存名为 “Open Terminal” 打开 设置 > 键盘&#xff0c;选择 键盘快捷键 以此选择 服…

Python(六十九)为什么要将元组设计成不可变序列

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

git bash 安装sdkadmin

1.下载相关安装包,复制到git 安装目录 D:\software\Git\mingw64\bin 2. 运行 curl -s "https://get.sdkman.io" | bash

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

文章目录 前言介绍系统框架原项目地址本项目开发开源地址硬件PCB软件功能 详细内容硬件外壳制作WS2812级联及控制MAX30102血氧传感器0.96OLEDFreeRTOS 效果视频总结 前言 在好几年前&#xff0c;我好像就看到了焊武帝 jiripraus在纪念结婚五周年时&#xff0c;制作的一个心跳跟…

10 日志系统(下)

10 日志系统&#xff08;下&#xff09; 本文内容 日志系统分为两部分&#xff0c;其一是单例模式与阻塞队列的定义&#xff0c;其二是日志类的定义与使用。 本篇将介绍日志类的定义与使用&#xff0c;具体的涉及到基础API&#xff0c;流程图与日志类定义&#xff0c;功能实现…

Android 刷新与显示

目录 屏幕显示原理&#xff1a; 显示刷新的过程 VSYNC机制具体实现 小结&#xff1a; 屏幕显示原理&#xff1a; 过程描述&#xff1a; 应用向系统服务申请buffer 系统服务返回一个buffer给应用 应用开始绘制&#xff0c;绘制完成就提交buffer&#xff0c;系统服务把buffer数据…

第三章 CUDA编译器环境配置篇

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…

Fatal error, can‘t open config file ‘/myredis/redis.conf‘: No such file or directory

在学习Redis到主从复制部分&#xff0c;进行相关练习&#xff0c;基本过程如下 1.首先将redis.conf文件cp到自建myredis文件夹中&#xff0c;并配置不同端口号的redis.conf redisXXXX.confd的配置内容如下 &#xff1a; include /myredis/redis.conf pidfile /var/run/redis_…

压力测试与测试工具jmeter的介绍

目录 一、性能指标 二、jmeter &#xff08;一&#xff09;JMeter 安装 &#xff08;二&#xff09;JMeter 压测示例 1、添加线程组 2、添加 HTTP 请求 3、添加监听器 4、启动压测&查看分析结果 &#xff08;三&#xff09;JMeter Address Already in use 错误解决 压力测…