当前位置: 首页 > news >正文

【探索C++】string类详解

  • (꒪ꇴ꒪ ),Hello我是祐言QAQ
  • 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍
  • 快上🚘,一起学习,让我们成为一个强大的攻城狮!
  • 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,请在评论区指正,感谢🙏


        在C++中,字符串处理是非常重要的一部分,而stringSTL中封装的一个重要工具,用于处理字符串。它的强大功能在上上篇博客中有些许讲解,那么本文将介绍C++中字符串的基本概念以及string类的构造方法,让你彻底理解和掌握C++中的string类

一. C++中字符串的概念

        在C++中,字符串是文本数据的重要形式,用于存储和处理文本信息。C++中,有多种方式来表示字符串,其中最常用的是使用string。掌握好string类对新手是及其重要的。

1.1 string

   string是C++标准模板库(STL)中封装的一个类,用于表示和操作字符串。它是对字符数组(char数组)或字符指针(char *)的封装,提供了一系列的成员函数(后文马上也会介绍到详细的常见成员用法等),简化了字符串的操作。

1.2 string类的优势

        与传统的字符数组或字符指针相比,string有以下优势:

  • 内存管理string自动管理字符串的内存,不需要手动释放内存或担心内存越界问题。

  • 操作简便string提供了丰富的成员函数,使得字符串的操作变得更加简单和灵活。

  • 安全性:由于内存管理由string自动处理,可以减少许多常见的内存错误

1.3 输入字符串

        需要注意的是,如果使用 cin 来输入字符串,它会在遇到空格时停止输入。如果需要获取包含空格的输入,应使用getline函数,如下所示:

string name;
getline(cin, name); // 通过getline获取包含空格的输入

        getline函数的具体用法呢上一篇博客中也有详细介绍,感兴趣请翻阅查看。

二. string字符串的构造

        现在让我们来看一下如何构造string字符串

2.1 默认无参构造函数

   string具有默认无参构造函数,可以用来创建一个空的字符串对象,如下所示:

string str; // 创建一个空的字符串对象

2.2 有参构造函数

   string也提供了有参构造函数,用于根据给定的内容创建字符串对象。以下是一些示例:

  • 使用字符串字面值创建字符串对象:
string str1("hello world"); // 使用字符串字面值创建字符串对象
string str2 = "hello world"; // 另一种方式
  • 使用字符和重复次数创建字符串对象:
string str3(10, 'A'); // 创建包含10个'A'字符的字符串

2.3 拷贝构造函数

    string还具有拷贝构造函数,可以通过复制已有的字符串对象来创建新的字符串对象,如下所示:

string str4 = str1; // 使用拷贝构造函数创建新的字符串对象
string str5(str2); // 另一种使用拷贝构造函数的方式

三. 重载运算符

        学习C语言时大家肯定对重载没有太多印象,如果你能记起 & 是被重载的那么你的C语言是扎实的,它既可以是按位与操作符又是取地址操作符;那么在C++中,string重载了许多操作符使得字符串的操作更加方便和灵活。下面我们将介绍一些常见的操作符重载函数。

3.1 赋值运算符(=)

        赋值运算符(=)被重载用于将一个字符串赋值给另一个字符串。例如:

string str1 = "hello world"; // 使用赋值运算符将一个字符串赋值给str1
string str2;
str6 = str1; // 使用赋值运算符将str4的值赋给str2
cout << "str2 = " << str2 << endl;

3.2 左移运算符(<<)

        左移运算符(<<)被重载用于将字符串输出到输出流,通常用于输出到控制台。例如:

string str1 = "hello world";
cout << "str1 = " << str1 << endl; // 使用左移运算符将str1输出到控制台

3.3 右移运算符(>>)

        右移运算符(>>)被重载用于从输入流中读取字符串。例如:

string str1;
cin >> str1; // 使用右移运算符从输入流中读取字符串

3.4 数组下标操作符([])

        数组下标操作符([])被重载,使得可以通过下标访问字符串中的字符。例如:

string str1 = "hello world";
char c = str1[2]; // 使用数组下标操作符访问字符串的第三个字符(下标从0开始)
cout << "c = " << c << endl; // 输出 c = l

3.5 加法运算符(+)

        加法运算符(+)被重载用于将两个字符串连接起来。例如:

string str1 = "hello ";
string str2 = "world";
string str3;
str3 = str1 + str2; // 使用加法运算符连接两个字符串

3.6 加法赋值运算符(+=)

        加法赋值运算符(+=)被重载用于将一个字符串与另一个字符串连接并将结果赋值给原字符串。例如:

string str1 = "hello ";
string str2 = "world";
str1 += str2; // 使用加法赋值运算符连接并赋值

3.7 关系运算符(==、!=、<、>、<=、>=)

        关系运算符(==!=<><=>=)被重载,用于比较两个字符串的大小关系。例如:

string str1 = "apple";
string str2 = "banana";
if (str1 < str2) {cout << "str1 小于 str2" << endl;
} else {cout << "str1 大于等于 str2" << endl;
}

注意:

        只要你的类(stig字符串)里面,只要对运算符有做重载,你都可以直接去用这个运算符,如果没有,则会报以下这个错误:
 

no match for‘operator|’         //operator是关键,表示后面的这个运算符没有做重载

四、C++的string成员函数

        之前的一篇博客已经详细的讲解了string类强大的功能,那么今天我们来看看该类下到底有多少常用的成员函数,用于操作和处理字符串。

4.1 length()size()

        返回字符串的长度,即字符的个数。

string str = "hello";
int len = str.length();// 或 int len = str.size();

4.2 empty()

        检查字符串是否为空,返回true表示为空,false表示非空。

string str = "hello";
bool isEmpty = str.empty(); // 返回 false

4.3 clear()

        清空字符串的内容,使其成为空字符串。

string str = "hello";
str.clear(); // str现在是一个空字符串

4.4 substr(start, length)

        返回从指定位置开始的指定长度的子字符串。

string str = "hello world";
string sub = str.substr(6, 5); // sub = "world"

4.5 find(substring)

        在字符串中查找子字符串,并返回第一次出现的位置(索引),如果未找到则返回string::npos

string str = "hello world";
size_t pos = str.find("world"); // pos = 6

4.6 replace(start, length, new_str)

        用新字符串替换指定位置的子字符串。

string str = "hello world";
str.replace(6, 5, "there"); // str = "hello there"

4.7 append(new_str)+=

        将新字符串追加到原字符串的末尾。

string str = "hello";
str.append(" world"); // str = "hello world"
// 或者
string str1 = "hello";
string str2 = " world";
str1 += str2; // str1 = "hello world"

4.8 insert(pos, new_str)

        在指定位置插入新字符串。

string str = "hello";
str.insert(3, " there"); // str = "hello there"

4.9 erase(start, length)

        删除指定位置的一段字符。

string str = "hello world";
str.erase(6, 5); // str = "hello "

4.10 compare(str2)

  与另一个字符串比较,返回0表示相等,正数表示大于,负数表示小于。

string str1 = "apple";
string str2 = "banana";
int result = str1.compare(str2); // result < 0,因为"apple"小于"banana"

     

4.11 at()

        获取字符串的单个字符。

string str1("hello");
string str2("world");
char c=str1.at(4);    //获取下标为4的这个字符
cout <"c ="<c <endl;
str2.at(0)='h';    //更改第0个字符为'h'
cout <"str2 ="<str2 <endl;

4.12 assign()

        字符串的赋值。

string str1("hello world");
string str2;
str2.assign(str1);
cout <"str2 ="<str2 <endl;string str3;
str3.assign(str1,0,5);    //从0开始,赋值5个
cout <"str3 ="<str3 <endl;

4.13 swap()

        字符串的交换。

string str1("hello");
string str2("world");
cout <"str1 ="<str1 <endl;
cout <"str2 ="<str2 <endl;
str1.swap(str2);
cout <"str1 ="<str1 <endl;
cout <"str2 ="<str2 <endl;

练习1:将字符串中所有的小写字母和大写字母颠倒并输出。

#include <iostream>
using namespace std;int main() {string str("Hello WorLD");// 遍历字符串中的每个字符for (int i = 0; i < str.length(); ++i) {// 如果字符是大写字母,将其转换为小写字母if (str[i] >= 'A' && str[i] <= 'Z') {str[i] += 32;}// 如果字符是小写字母,将其转换为大写字母else if (str[i] >= 'a' && str[i] <= 'z') {str[i] -= 32;}}cout << str << endl;return 0;
}


练习2:编写一个程序,去掉给定字符串中重复的字符,比如goooooogle   =>    gole。

#include <iostream>
using namespace std;int main() {string str;cin >> str; // 从输入获取字符串,例如输入:gooooogle// 遍历字符串中的每个字符for (int i = 0; i < str.length(); ++i) {// 再次遍历字符串中的字符,从当前字符的下一个位置开始for (int j = i + 1; j < str.length(); ) {// 如果当前字符与后面的字符相同,就删除后面的字符if (str[i] == str[j]) {str.erase(j, 1); // 删除重复字符(假设删除字符的后一个还是这个字符)} else {++j;}}}cout << str << endl; // 输出移除重复字符后的字符串return 0;
}

        更多C/C++语言Linux系统数据结构ARM板实战相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            系统、网络编程

                                     探索C++

                                             6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉🎉🎉感谢关注🎉🎉🎉

相关文章:

【探索C++】string类详解

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

python 第一次作业

1.使用turtle换一个五环 2.设计这样一个程序&#xff1a;输入一个数字 判断它是不是一个质数 使用turtle换一个五环&#xff1a; >>> import turtle #导入模块 >>> turtle.width(10) #设置圆圈宽度 >>> turtle.color("blue&qu…...

个人博客网站一揽子:Docker建站(Nginx、Wordpress、MySql)

前言 既然安装了Docker&#xff0c;那就不妨建立一个自己的博客网站。实现内外网隔离网站部署&#xff0c;更安全。 1.创建Docker子网络 首先创建一个Docker虚拟子网&#xff1a; sudo docker network create wpnt检查是否建立成功&#xff1a; sudo docker network ls最后…...

Unity 课时 4 : No.4 模拟面试题

课时 4 : No.4 模拟面试题 C# 1. 请说明字符串中 string str null string str “” string str string.Empty 三者的区别 第一个未作初始化没有值, 第二个为空字符串, 答案&#xff1a; str null 在堆中没有分配内存地址 str "" 和 string.Empty 一样都是…...

Golang 基础面试题 01

Golang 面试题合集.png 背景 在之前的文章中分享了 k8s 相关的面试题&#xff0c;本文我们重点来讨论和 k8s 密切相关的 Go 语言面试题。 这几年随着云原生的兴起&#xff0c;大部分后端开发者&#xff0c;特别是 Java 开发者都或多或少的想学习一些 Go 相关的技能&#xff0c;…...

007-第一代软件需求整理

第一代软件需求整理 文章目录 第一代软件需求整理项目介绍需求来源需求来源1&#xff1a;竞品软件分析需求来源2&#xff1a;医生&#xff08;市场&#xff09;需求来源3&#xff1a;项目组内部需求来源4&#xff1a;软件组内部需求来源5&#xff1a;软件开发成员需求来源6&…...

XMLHttpRequest介绍

目录 一、介绍1.创建 XMLHttpRequest2.初始化3.发送请求4.获取响应5.响应类型 二、发送GET请求示例三、发送POST请求示例四、发送POST请求下载文件示例五、发送POST请求上传文件示例 一、介绍 1.创建 XMLHttpRequest let xhr new XMLHttpRequest();2.初始化 xhr.open(metho…...

阿里云无影云电脑和传统PC有什么区别?

阿里云无影云电脑和传统电脑PC有什么区别&#xff1f;区别大了&#xff0c;无影云电脑是云端的桌面服务&#xff0c;传统PC是本地的硬件计算机&#xff0c;无影云电脑的数据是保存在云端&#xff0c;本地传统PC的数据是保存在本地客户端&#xff0c;阿里云百科分享阿里云无影云…...

基于matlab实现的船舶横摇运动仿真程序

完整程序&#xff1a; clc clear syms w we; w0.4:0.05:1.6;mu90;v6;%kb1;kt1;%航速6m/s&#xff0c;航向90度&#xff0c;即横浪&#xff0c;cos(90)0 T3;B10;Sw0.785;%船宽10米&#xff0c;吃水3米,水线面系数假设为0.785 weww.^2.*v/9.8; for i1:24 delta_we(i)we(i1)-…...

Java手写二叉索引树和二叉索引树应用拓展案例

Java手写二叉索引树和二叉索引树应用拓展案例 1. 算法思维导图 以下为二叉索引树的实现原理的思维导图&#xff0c;使用Mermanid代码表示&#xff1a; #mermaid-svg-raMRIu7t3H33MKh1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#…...

大数据知识点之大数据5V特征

大数据的特征可以浓缩为五个英文单词&#xff0c;Volume(大量&#xff09;、Variety(多样性&#xff09;、Velocity(速度&#xff09;、Value(价值&#xff09;、Veracity(准确性&#xff09;。因为是5个特征都是以“V”开头的英文单词&#xff0c;又叫大数据5V特征。 概述&…...

Java的Socket通信的断网重连的正确写法

Java的Socket通信的断网重连的正确写法 Socket通信的断网重连介绍客户端与服务端源码演示截图本地演示服务器演示演示截图 总结 Socket通信的断网重连介绍 针对于已经建立通信的客户端与服务器&#xff0c;当客户端与服务器因为网络问题导致网络不通而断开连接了或者由于服务器…...

Rocketmq--消息发送和接收演示

使用Java代码来演示消息的发送和接收 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.2</version> </dependency> 1 发送消息 消息发送步骤: 创建…...

ArcGIS Pro将SHP文件转CAD并保留图层名称

相信大家应该都使用过ArcGIS将SHP文件转CAD格式&#xff0c;转换过后所有的要素都在一个图层内&#xff0c;那么有没有办法将SHP文件某个字段的值作为CAD的图层名字呢&#xff0c;答案是肯定的&#xff0c;这里就为大家介绍一下ArcGIS Pro转CAD文件并且保留图层名称的方法&…...

GEE:使用for循环合成时间序列影像

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Google Earth Engine创建一个时间序列图像集合,以便进行时间序列分析或生成动态图像。 文章目录 一、核心代码二、代码解释三、示例代码链接一、核心代码 // 创建一个空的 image 图像集合 var imagelist = ee.List([])…...

flink1.13.2版本的对应的hive的Hcatalog的使用记录

依赖版本要求<hive.version>3.1.2</hive.version><flink.version>1.13.2</flink.version><hadoop.version>3.3.2</hadoop.version><scala.binary.version...

STM32 ADC介绍和应用

目录 1.ADC是什么&#xff1f; 2.ADC的性能指标 3.ADC特性 4.ADC通道 5.ADC转换顺序 6.ADC触发方式 7.ADC转化时间 8.ADC转化模式 扫描模式 单次转换/连续转换 9.ADC实验 使用ADC读取烟雾传感器的值 代码实现思路&#xff1a; 1.ADC是什么&#xff1f; 全称&#…...

vue项目打包_以生产环境prod模式打包_vue-cli-service 不是内部或外部命令,也不是可运行的程序---vue工作笔记0025

打开命令行: 首先执行npm install 不执行会报错: npm run build:prod --scripts-prepend-node-pathauto 然后再这样执行就是以生产环境模式打包了....

FreeSWITCH的liberal dtmf

sip profile配置liberal-dtmf为true&#xff0c;或者通道变量rtp_liberal_dtmf为true&#xff0c;其含义就是不挑剔协商的DTMF&#xff0c;offer rfc2833并接受远端的rfc2833 和SIP INFO。 sofia.c的部分内容&#xff1a; // 收到sip info的处理 void sofia_handle_sip_i_inf…...

透明度模糊Android实现

最近有个需求&#xff0c;需要透明度加模糊&#xff0c;并且无法通过Glide的方式实现。研究后发现有一个第三方库可以实现这个效果 implementation com.github.Dimezis:BlurView:version-2.0.3在activity的onCreate&#xff08;&#xff09;方法中 实现效果 可以看到上边的bar…...

JavaScript学习笔记04

JavaScript笔记04 方法 定义方法 当一个函数是一个对象的属性时&#xff0c;称之为方法。例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script>let p…...

18 Python的sys模块

概述 在上一节&#xff0c;我们介绍了Python的os模块&#xff0c;包括&#xff1a;os模块中一些常用的属性和函数。在这一节&#xff0c;我们将介绍Python的sys模块。sys模块提供了访问解释器使用或维护的变量&#xff0c;以及与解释器进行交互的函数。 通俗来讲&#xff0c;sy…...

Spring Boot 各版本的支持时间

1. Spring Boot 各版本的支持时间 Spring Boot 2.7 的版本&#xff0c;支持到2023-11-18&#xff0c;之后就要停止支持了。 按照官网的数据&#xff0c;3.0 的版本也是到2023年11月就停止支持了。如果要转到SpringBoot3&#xff0c;直接从3.1开始吧。到写这篇文章时&#xff…...

华为云云耀云服务器L实例评测|Git 私服搭建指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 Git 私有服务器搭建指南 系统配置&#xff1a;2核2G 3M Ubuntu 20.04 我们平时在使用代码托管服务的时候&#xff0c;可能某些代码托管平台对成员有限制&#xff0c;或是由于内容原因会对…...

Linux下的Swap内存

目录 一、Swap简介二、Swap内存查看三、Swap内存释放1、关闭swap2、查看关闭进度2、开启swap 一、Swap简介 swap space 是磁盘上的一块区域&#xff0c;可以是一个分区&#xff0c;也可以是一个文件。所以具体的实现可以是 swap分区 也可以是 swap文件。 当系统物理内存吃紧时…...

Unity中程序集dll

一&#xff1a;前言 一个程序集由一个或多个文件组成&#xff0c;通常为扩展名.exe和.dll的文件称为程序集&#xff0c;.exe是静态的程序集&#xff0c;可以在.net下直接运行加载&#xff0c;因为exe中有一个main函数(入口函数&#xff09;&#xff0c;.dll是动态链接库&#…...

识典百科取代快懂百科,如何在识典百科创建词条?

我们一个营销项目里面有四个百科词条的创建&#xff0c;在执行过程中遇见了快懂百科升级&#xff0c;创建词条请前往识典百科&#xff0c;看这个意思字节跳动是要把快懂百科升级整合到识典百科了。 快懂百科升级整合进入识典百科 近年来&#xff0c;字节跳动动作不断&#xff0…...

入门python

[NOIP2006 普及组] 明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了 N N N 个 1 1 1 到 1000 1000 1000 之间的随机整数 ( N ≤ 100 ) (N\leq100) (N≤100)&#xff0c;对于其中重复的数字…...

基于vue的黑马前端项目小兔鲜

目录 项目学习 初始化项目 建立项目 引入elementplus elementPlus主题设置 配置axios 路由 引入静态资源 自动导入scss变量 Layout页 组件结构快速搭建 字体图标渲染 一级导航渲染 吸顶导航交互实现 Pinia优化重复请求 Home页 分类实现 banner轮播图 …...

细节决定成败!jdbc的List<?> qryList4Sql(String sql)报错-标志符过长

问题产生背景&#xff1a; 在写sql时&#xff0c;想着简单直接就偷懒了&#xff0c;没有看清细节 操作步骤跟发现问题&#xff1a; 1. sql语句的执行选用的是jdbc提供的List<?> qryList4Sql(String sql) 方法 2&#xff0c;这是我的sql语句(简化处理) String sql "…...

网站icp备案咋做/泉州网站seo外包公司

手机带电脑上网 A. 手机和电脑都是wlan方式。 手机&#xff1a; 设置 / 无线和网络 / 绑定与便携式热点 / 便携式WLAN热点 &#xff0c; 打上勾&#xff1b; 如果你要加上密码&#xff0c; 配置一下“配置WLAN热点” 电脑&#xff1a; 如果上一步你没有修改 “配置WLAN热点…...

led高端网站建设/自动的网站设计制作

现在微信的用户体验一直被产品经理们所推崇,今天这里具体分析一下微信在WebView的进度条上怎么提升用户体验.最终微信的加载进度条的效果图网络正常的状态&#xff0c;分为两种加载速度,前部分正常速度加载,后边速度特意放慢,让用户感觉到你在非常卖力的在进行网络请求.断开网络…...

怎么做自助交易网站/网络营销推广活动有哪些

第1关:创建数据库和表 任务描述 本关任务:编写一个能计算数组平均值和最大值的小程序。 相关知识 为了完成本关任务,你需要掌握:1. SQLite数据库连接,2.创建数据库和表。 SQLite数据库连接 下面的例子显示了如何连接到一个现有的SQLite数据库。如果参数中指定的数据库不…...

成都微信微网站建设/百度推广客服电话24小时

一、Numpy Python中做科学计算的基础库&#xff0c;重在数值计算&#xff0c;多用于处理大型多维数组上的数值运算。 特点&#xff1a;快速、方便、科学计算的基础库 安装&#xff1a;pip install numpy 二、numpy创建数组&#xff08;矩阵&#xff09; import numpy as np…...

广告设计与制作学什么/网站优化服务

文章摘要&#xff1a;幼儿园的教育方式在逐步发生改变,以游戏贯穿幼儿教学已经成为当下幼儿教育的主流.在对幼儿实施游戏化教育中,我们对此进行了如下探索与研究.一、幼儿为什么要游戏化教学幼儿教学游戏化,是指把幼儿教育的目标、内容、要求融于各种游戏之中,教学游……幼儿教…...

网站黄页推广软件/个人怎么在百度上打广告

导语&#xff1a;Facebook周一在官方博客中发表署名艾唐巴克什(Eytan Bakshy)的研究报告称&#xff0c;虽然传统观点将社交网络视为一个只能提供相同视角的“回声室”&#xff0c;但事实上&#xff0c;通过量化分析和理论研究不难发现&#xff0c;社交网络用户分享的更多信息来…...