33 - C++中的字符串类

news2025/8/12 4:05:42

---- 整理自狄泰软件唐佐林老师课程

1. 历史遗留问题

C语言 不支持真正意义上的字符串
C语言用 字符数组一组函数 实现字符串操作
C语言 不支持自定义类型,因此无法获得字符串类型

  • 解决方案
    • 从C到C++的进化过程 引入了 自定义类型
    • 在C++中可以通过类完成字符串类型的定义
  • 问题:C++中的原生类型系统是否包含字符串类型?

2. 标准库中的字符串类

C++语言直接支持C语言的所有概念
C++语言中 没有 原生的字符串类型

2.1 C++标准库中提供了 string类型

  • string直接支持字符串连接
  • string直接支持字符串的大小比较
  • string直接支持子串查找和提取
  • string直接支持字符串的插入和替换

2.2 编程实验:字符串类的使用

#include <iostream>
#include <string>

using namespace std;

void string_sort(string a[], int len)
{
    for(int i=0; i<len; i++)
    {
        for(int j=i; j<len; j++)
        {
            if( a[i] > a[j] )
            {
                swap(a[i], a[j]);
            }
        }
    }
}

string string_add(string a[], int len)
{
    string ret = "";
    
    for(int i=0; i<len; i++)
    {
        ret += a[i] + "; ";
    }
    
    return ret;
}

int main()
{
    string sa[7] = 
    {
        "Hello World",
        "D.T.Software",
        "C#",
        "Java",
        "C++",
        "Python",
        "TypeScript"
    };
    
    string_sort(sa, 7);
    
    for(int i=0; i<7; i++)
    {
        cout << sa[i] << endl;
    }
    
    cout << endl;
    
    cout << string_add(sa, 7) << endl;
    
    return 0;
}

在这里插入图片描述

2.3 字符串和数字的转换

  • 标准库中提供了相关的类对字符串和数字进行转换

  • 字符串流(sstream用于string的转换

    • <sstream> 相关头文件
    • istringstream 字符串输入流
    • ostringstream 字符串输出流
  • 使用方法:

    • string ==> 数字
      在这里插入图片描述

    • 数字 ==> string
      在这里插入图片描述

2.4 编程实验:字符串和数字的转换

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

#define TO_NUMBER(s, n) (istringstream(s) >> n)
#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())

int main()
{
    double n = 0;
   
    if( TO_NUMBER("234.567", n) )
    {
        cout << n << endl;    
    }

    string s = TO_STRING(12345);
    cout << s << endl;     
    
    return 0;
}

在这里插入图片描述

注:我们来分析一下上面两个宏定义:

#define TO_NUMBER(s, n) (istringstream(s) >> n)
#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())

他们的特别之处就在于:直接调用构造函数而产生了一个临时对象,临时对象的生命周期只有一条语句,利用临时对象把想要的变量输入或输出。(ostringstream() << n) 这条语句得出的结果类型返回basic_ostream类对象,它应该是ostringstream的父类,它可能没有str成员函数,所以要类型转换为子类对象,所以强制类型转换成 ostringstream& 。
在这里插入图片描述

2.5 编程实验:字符串循环右移

#include <iostream>
#include <string>

using namespace std;

string operator >> (const string& s, unsigned int n)
{
    string ret = "";
    unsigned int pos = 0;
    
    n = n % s.length();
    pos = s.length() - n;
    ret = s.substr(pos);
    ret += s.substr(0, pos);
    
    return ret;
}

int main()
{
    string s = "abcdefg";
    string r = (s >> 3);
    
    cout << r << endl;
    
    return 0;
}

在这里插入图片描述

3. 小结

  • 应用开发中大多数的情况都在进行字符串处理
  • C++中没有直接支持原生的字符串类型
  • 标准库中通过 string类 支持字符串的概念
  • string类支持字符串和数字的相互转换
  • string类的应用使得问题的求解变得简单

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

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

相关文章

iOS上架app store详细教材

1、安装iOS上架辅助软件Appuploader 2、申请iOS发布证书&#xff08;p12&#xff09; 3、申请iOS发布描述文件&#xff08;mobileprovision&#xff09; 4、打包ipa 5、上传ipa到iTunes Conn 1、安装iOS上架辅助软件Appuploader2、申请iOS发布证书&#xff08;p12&#xff09;…

ImmunoChemistry艾美捷牛膜联蛋白V-荧光素凋亡检测试剂盒方案

ImmunoChemistry艾美捷牛膜联蛋白V-荧光素细胞凋亡检测试剂盒提供了一种经验证的方法&#xff0c;可使用重组荧光素结合的牛膜连蛋白V和碘化丙啶&#xff08;PI&#xff09;快速、轻松地区分两个死亡细胞群和活细胞群。这些细胞将被膜联蛋白V-荧光素&#xff08;绿色荧光&#…

docker容器持久化

第六章容器持久化 容器数据卷 什么是容器数据卷&#xff1f; 容器之间可以有一个数据共享技术&#xff01;docker容器中产生的数据&#xff0c;同步到本地&#xff01; 这就是卷技术&#xff01;目录的挂载&#xff0c;将我们容器内的目录&#xff0c;挂在到linux上面&#x…

线性时间选择(Top K)问题(Java)

线性时间选择&#xff08;Top K&#xff09;问题&#xff08;Java&#xff09; 文章目录线性时间选择&#xff08;Top K&#xff09;问题&#xff08;Java&#xff09;1、前置介绍2、分治法求解3、代码实现4、复杂度分析5、扩展6、参考资料1、前置介绍 定义 选择问题&#xff0…

docker可视化与制作和提交自己的镜像

第四章docker可视化 portainer docker的图形化管理工具&#xff01;提供一个后台面板供我们操作&#xff01; docker run -d -p 8080:9000 \--restartalways -v /var/run/docker.sock:/var/run/docker.sock --privilegedtrue portainer/portainer 访问测试&#xff1a;外网…

Python_数据容器_元组tuple

一、元组tuple定义 为什么需要元组 列表是可以修改的&#xff0c;如果想要传递的信息不被篡改&#xff0c;列表就不适合了 元组和列表一样&#xff0c;都是可以封装多个不同类型的元素在内 最大的不同点在于&#xff1a; 元祖一旦定义完成&#xff0c;就不可修改 所以&am…

SpringBoot中使用JDBC

JDBC基础使用&#xff1a; JDBC基础使用_做测试的喵酱的博客-CSDN博客 一、SpringBoot使用JDBC&#xff0c;依赖 依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId&…

linux zookeeper kafka_2.12-2.2.0 集群

文章目录一、zookeeper服务搭建1. 下载2. 解压3. 创建目录4. 调整配置5. 配置myid6. 开放防火墙7.启动验证zk二、kafka集群搭建2.1. 下载软件2.2. 解压2.3. 配置2.5. 启动kafka三、测试验证3.1. 创建一个主题3.2. 发送消息3.3. 消费消息预先准备&#xff1a;上传软件至服务器19…

使用Avalonia跨Linux平台

Avalonia&#xff0c;读&#xff1a;阿瓦隆尼亚 这里的跨平台指的是&#xff0c;使用c#语言开发跨Linux平台。c#在Windows桌面开发中很强&#xff0c;但是在Linux桌面中&#xff0c;不能跨平台&#xff0c;Qt可以在Linux中跨平台&#xff0c;但是那是另外一门语言了。Avalonia…

计算机组成原理4小时速成:计算机运算方法,无符号数和有符号数,定点数和浮点数,移位运算,加减运算,乘法运算,原码,反码,补码

计算机组成原理4小时速成&#xff1a;计算机运算方法&#xff0c;无符号数和有符号数&#xff0c;定点数和浮点数&#xff0c;移位运算&#xff0c;加减运算&#xff0c;乘法运算&#xff0c;原码&#xff0c;反码&#xff0c;补码 2022找工作是学历、能力和运气的超强结合体&…

[激光原理与应用-16]:《激光原理与技术》-2- 光的本质(粒子、波动说、电磁波、量子)

目录 前言&#xff1a;“光” 一、光的微粒说 - 牛顿 二、光的波动说 - 托马斯杨 惠更斯 三、光是电磁波 - 麦克斯韦 四、光的波动说受到的挑战&#xff0c;光的波动说重新唤醒 五、光量子假说 - 爱因斯坦 六、光的理论综合 七、光的重要特性 7.1 光的相干性 7.2 相…

安装ideaIU-2022.1.4报错问题解决办法

原来版本是2020 现在因为要用到JDK17 而IDEA2020支持的JDK只能到14 所以我们现在在下载一个2022 .1.4 这时我们安装好后 会发现如下错误 原因分析&#xff1a; JetBrains 会将各个产品的这些文件也放到这个目录中&#xff0c;而新版本的 IntelliJ IDEA 在安装时遭遇了旧版本…

Web(二)html5基础-文本控制类标签(知识训练和编程训练)

web知识训练_html5_文本控制类标签 第1关_web知识训练_html5_文本控制类标签 -------------------------------------------- web编程训练_html5_文本控制类标签 第1关_html5_网页背景及标题段落标签 编程要求 根据前面的效果图&#xff0c;在右侧编辑器中的Begin - End区域…

10K涨到30K,5年大厂横跳,经验全在这两份Java面试精华总结里了

为了帮助大家跳槽成功多长点薪资&#xff0c;我这边给大家准备了两份面试资料。这两份资料可大有来头&#xff0c;已经帮助五位我认识的人进入大厂。所以说含金量还是很高的。 这两份资料可以让你体验到原有知识从破碎到重建&#xff0c;豁然开朗的过程。5年大厂横跳真实案例加…

数据库事务

1 概述 数据库的事务&#xff08;Transaction&#xff09;是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令。 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么同时成功&#xff0c;要么同时失败。 事务是一个不可…

前端开发——HTML5新增的客户端校验

1.使用校验属性执行校验 HTML5新增了表单的校验属性,如required、pattern等。 required:定义表单不能为空。属性值是required或者省略.pattern:定义表单满足正则表单式1.required属性 required属性用于不能为空。属性值是required或者省略. 代码如下&#xff1a; <form …

34 - 数组操作符的重载

---- 整理自狄泰软件唐佐林老师课程 1. 问题一 string类对象具备C方式字符串的灵活性吗&#xff1f;还能直接访问单个字符吗&#xff1f; 1.1 字符串类的兼容性 string类最大限度的考虑了C字符串的兼容性可以按照使用C字符串的方式使用string对象 1.2 编程实验&#xff1a…

BUUCTF Reverse/[GWCTF 2019]re3

main函数代码&#xff0c;这里改写了内存空间的属性&#xff0c;还是自解密 void __fastcall __noreturn main(int a1, char **a2, char **a3) {int i; // [rsp8h] [rbp-48h]char s[40]; // [rsp20h] [rbp-30h] BYREFunsigned __int64 v5; // [rsp48h] [rbp-8h]v5 __readfsqwo…

在Thymeleaf中格式化日期

1. 简介 在本文中&#xff0c;我们将介绍在百里香叶模板中格式化日期的方法。我们将使用 Thymeleaf 引擎中提供的特殊#calendars实用程序&#xff0c;该实用程序是为模板上的日期操作而创建的。 2. 使用实用程序类#calendar Thymeleaf带有一个名为#calendars的特殊实用程序类…

万字长文:从实践到原理说透Golang defer

本从以go-1.16版本源码为基础&#xff0c;介绍了defer关键字的使用规则、实现原理和优化路线&#xff0c;最后介绍了几种将近的使用场景。试图对 go defer 关键字应用到实现原理有一个全面的了解。 欢迎关注公众号闲余说 defer 概述 Go 提供关键字defer 处理延迟调用问题。在语…