【探索C++】string类详解

news2024/11/25 21:21:16
  • (꒪ꇴ꒪ ),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)开发板实战

📢写在最后

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

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

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

相关文章

pytest一些常见的插件

Pytest拥有丰富的插件架构&#xff0c;超过800个以上的外部插件和活跃的社区&#xff0c;在PyPI项目中以“ pytest- *”为标识。 本篇将列举github标星超过两百的一些插件进行实战演示。 插件库地址&#xff1a;http://plugincompat.herokuapp.com/ 1、pytest-html&#xff1…

浏览器缓存学习笔记

浏览器存储 示例&#xff1a;网页的搜索历史 application->Local Storage&#xff0c;数据通过key-value保存 保存数据 <button onclick"saveData()">点击保存数据</button><script type"text/javascript">let p { name: Jack, ag…

智慧食堂操作教程,建议收藏!

医院食堂作为医疗机构不可或缺的一部分&#xff0c;不仅要提供高质量、健康的餐饮选择&#xff0c;还需要为患者和医护人员提供便捷的用餐体验。 随着科技的不断发展&#xff0c;智慧收银系统应运而生&#xff0c;它已经在医疗机构中引起了广泛关注。智慧收银系统不仅为患者和医…

linux 设置打开文件数

可以使用下面的文件进行设置 /etc/security/limits.d/90-nproc.conf 先来看/etc/security/limits.d/90-nproc.conf 配置文件&#xff1a; [root ~]# cat /etc/security/limits.d/90-nproc.conf # Default limit for number of users processes to prevent # accidental fork…

【产品运营】如何提升B端产品竞争力(下)

“好产品不是能力内核&#xff0c;做好产品的流程才是” 一、建立需求池和需求反馈渠道 需求池管理是B端产品进化最重要的环节&#xff0c;它的重要性远超产品设计、开发等其他环节。 维护需求池有主动和被动两种。 主动维护是产品经理在参与售前、迭代、交付、售后、竞品分…

PMP项目管理课程介绍-2023

8个项目管理工具模板、60个项目管理甘特图标模板、赠送30本项目管理电子书 &#xff08;PMI-PMP&#xff09;国际项目经理认证 培训简章 “21世纪是项目管理的世纪” “战略规划项目管理企业竞争力” 课程背景 “PMP”&#xff0c;即Project Management Professional&#xff0…

Yolov5创新:NEU-DET钢材表面缺陷检测,优化组合新颖程度较高,CVPR2023 DCNV3和InceptionNeXt,涨点明显

1.钢铁缺陷数据集介绍 NEU-DET钢材表面缺陷共有六大类&#xff0c;分别为&#xff1a;crazing,inclusion,patches,pitted_surface,rolled-in_scale,scratches 每个类别分布为&#xff1a; 训练结果如下&#xff1a; 2.基于yolov5s的训练 map值0.742&#xff1a; 2.1 Incepti…

1978-2021年全国各省城镇与农村恩格尔系数数据

1978-2021年全国各省城镇与农村恩格尔系数数据 1、时间&#xff1a;1978-2021年 2、指标&#xff1a;城镇恩格尔系数、农村恩格尔系数 3、范围&#xff1a;31省市 4、来源&#xff1a;各省年鉴 5、用途&#xff1a;反应居民生活质量 6、指标解释&#xff1a; 恩格尔系数…

C++---链表

1、链表 1.1、链表的结构 每个链表开头都有一个头指针Head尾节点的指针域为NULL&#xff0c;用于判断此列表是否结束 如果一个链表开始就为NULL&#xff0c;那么该链表为空链表 链表中的先后不代表在真实内存中的位置&#xff0c;只是单纯的逻辑上关系 1.2、创建链表 我们首…

Spring常见面试题总结

什么是Spring Spring是一个轻量级Java开发框架&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题&#xff0c;以提高开发效率。它是一个分层的JavaSE/JavaEE full-stack&#xff08;一站式&#xff09;轻量级开源框架&#xff0c;为开发Java应用程序…

iPhone升级iOS17后待机模式不能用、没反应?这7个方法快速解决!

iPhone待机模式是苹果为iOS17版本加入的新功能之一&#xff0c;当我们不用iPhone 时&#xff0c;能将它随手放在一旁&#xff0c;并以横向全屏的方式观看时钟与App小工具资讯等。 不过有些果粉发现他们的iPhone待机模式不能用、没反应&#xff0c;照着步骤操作也无法进入iPhon…

MX6LL控制LED设备

注&#xff1a;本篇基于野火IMX6LL PRO开发板 一.什么是驱动程序 驱动程序&#xff08;Driver&#xff09;是一种软件&#xff0c;用于充当操作系统与硬件设备之间的桥梁&#xff0c;使它们能够互相通信和交互。驱动程序的主要功能是提供一个标准化的接口&#xff0c;使操作系…

从0搭建夜莺v6基础监控告警系统(一):基础服务安装

文章目录 1. 写在前面1.1. 官方文档传送门1.2. 部署环境 2. 服务安装2.1. 基础设置2.2. 安装中间件2.3. 安装 nightingale-v62.4. 安装 VictoriaMetrics2.5. 安装 Categraf 3. 部署总结3.1. 安装总结 1. 写在前面 1.1. 官方文档传送门 项目介绍 架构介绍 仪表盘 黄埔营培训计…

来袭!SOLIDWORKS 2024 主要增强功能

在SOLIDWORKS软件使用过程中&#xff0c;我们知道您创建了出色的设计&#xff0c;您的出色设计也会得到构建。为了简化和加快从概念到制造产品的产品开发流程&#xff0c;SOLIDWORKS 2024 包含用户驱动的全新增强功能&#xff0c;重点关注&#xff1a; • 提高工作智能化程度。…

怎么在便携式手持嵌入式设备中实现安全的数字数据传输

为了实施附加的安全性&#xff0c;一些密码算法也可以指定一组不应从设备公开的常数值。这些存储在设备中的&#xff0c;需要防止未经授权暴露的秘密密钥和秘密值在一系列文章中被称为“秘密密钥”。 秘密密钥存储在设备内部&#xff0c;甚至在设备的整个生命周期中都存在。设…

浅谈双十一背后的支付宝LDC架构和其CAP分析

本人汤波&#xff0c;superthem.com 圆领超级个体创始人&#xff0c;Github page地址&#xff1a;https://tbwork.github.io/ 看到很多人在盗用我的文章&#xff0c;还标记成原创&#xff0c;进行收费&#xff0c;非常令人作呕。 我的所有技术文章全部免费阅读&#xff0c;大家…

在Python中 作用域与命名空间的坑

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 1. 命名空间 1.1 什么是命名空间 Namespace命名空间&#xff0c;也称名字空间&#xff0c;是从名字到对象的映射。 Python中&#xff0c;大…

VMware17 不可恢复错误mks解决方案

用的虚拟机VMware17版本&#xff0c;然后运行带HDR的unity程序&#xff0c;结果报错 网上找了很多解决方案&#xff0c;都没用。毕竟需要在不放弃虚拟机3D加速的情况下运行。 最终皇天不负有心人&#xff0c;亲测有效的方法&#xff1a; 在虚拟机名字.vmx文件里添加以下2行&a…

【整理】难得的中文开源数据集

搞大模型训练&#xff0c;最重要的就是高质量的数据集。 得数据者得天下。全球最大的AI开源社区Huggingface上&#xff0c;已经有5万多的开源数据集了&#xff0c;其中涉及中文的数据集只有区区可怜的151个。中国的AI产业要迎头赶上&#xff0c;中文的数据集是最大的短板之一。…

IOTE2023物联网展最新快讯|央企入驻,找物联网平台这一家就够了

IOTE 2023第20届国际物联网展深圳站即将于9月20-22日在深圳国际会展中心&#xff08;宝安&#xff09;启幕&#xff01;航天科技控股集团股份有限公司旗下AIRIOT物联网平台亮相【工业物联网展区9B31-1展位】。 AIRIOT物联网平台定位于通用型物联网技术框架产品&#xff0c;以软…