【探索C++】string类:更强大的字符串处理

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

        在C++编程中,有一个强大的工具,它极大地简化了字符串处理,那就是string。与C语言中的字符串相比,string不仅更安全,还提供了更多的功能。本篇博客将详细介绍C++中的string,以及它与C语言字符串的区别,方便大家快速入门C++。

一、 动态分配与自动管理

        在C语言中,字符串是通过字符数组表示的,需要手动管理内存的分配和释放。而在C++中,string动态分配的字符串,它自动处理内存管理,避免了许多内存错误。这就意味着我们无需担心缓冲区溢出和内存泄漏等问题,大大节约开发时间(较小的代码量),也避免了一些不必要的犯错(手动管理内存的复杂性)。

        下面我们就C与C++在内存管理上进行一下代码量对比体会一下动态分配与自动管理。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    //分配
    char *dynamicString = (char *)malloc(20 * sizeof(char));
    strcpy(dynamicString, "Dynamic string handling");//strcpy写入数据
    printf("%s\n", dynamicString);//打印
    
    //再分配
    dynamicString = realloc(dynamicString, 30 * sizeof(char));
    strcat(dynamicString, " in C"); //拼接
    printf("%s\n", dynamicString);

    //释放
    free(dynamicString);

    return 0;
}

        然而在C++中,这些操作将不会在出现,string类将自动处理内存管理,下面让我们来看看C++实现同样的操作所需代码量吧:

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

int main() {
    //创建字符串
    string dynamicString = "Dynamic string handling";
    cout << dynamicString << endl;//输出

    dynamicString += " in C++"; // 自动扩展字符串长度
    cout << dynamicString << endl;//再输出

    return 0;
}

        我天这么少嘛,即使是一个新学C++的同学恐怕也能看懂吧,所以这就是C++被发开的初衷,让编程更简单!

二、长度管理

        C语言中的字符串以NULL终止,需要使用特定的字符(通常是\0)表示字符串的结束,容易出现缓冲区溢出。而C++中的string自带长度信息,不需要显式的NULL终止字符,从而更安全。

         代码:

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

int main() {
    string s = "Hello, world!";
    cout << "字符串长度为: " << s.length() << endl;

    return 0;
}

三、 操作和功能

        C语言中的字符串操作需要调用库函数,例如strcpystrcat等。而C++中的string提供了丰富的成员函数,例如appendinsertsubstr等,使字符串操作更加方便。

         代码:

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

int main() {
    string s = "Hello";
    s.append(", world!"); // 追加字符串
    cout << s << endl;

    s.insert(5, " there"); // 插入字符串
    cout << s << endl;

    s.erase(6, 5); // 删除一部分字符串
    cout << s << endl;

    return 0;
}

四、拼接和连接

        C语言中的字符串拼接需要手动分配足够的空间,并使用库函数strcat进行拼接。

char str1[50] = "Hello, ";
char str2[] = "world!";
char result[100];

strcpy(result, str1);  // 复制 str1 到 result
strcat(result, str2);  // 连接 str2 到 result

printf("%s\n", result);  // 输出: Hello, world!

        C++中的string支持直接使用+运算符进行字符串连接,极大地简化了操作。

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

int main() {
    string str1 = "Hello, ";
    string str2 = "world!";
    string result;

    result = str1 + str2;

    cout << result << endl;  // 输出: Hello, world!

    return 0;
}

五、 赋值和复制

        C语言中的字符串赋值需要使用库函数strcpy或逐字符复制。

char source[] = "Hello";
char destination[20];
strcpy(destination, source);

        C++中的string可以直接使用=进行赋值,同时支持深拷贝,不需要手动管理内存。

string source = "Hello";
string dest;
dest = source;

六、 可迭代性

        C语言中的字符串不是容器,难以方便地进行迭代和遍历。

char str[] = "Hello";
for (int i = 0; str[i] != '\0'; i++) {
    printf("%c\n", str[i]);
}

        C++中的string是标准的容器,支持使用迭代器或范围循环进行遍历。

string str = "Hello";
for (char c : str) {
    cout << c << endl;
}

七、 扩展性和自定义

        C语言中的字符串操作受限,难以实现更高级的字符串处理。C++中的string允许自定义成员函数和操作,支持更复杂的字符串处理需求。

#include <iostream>    
#include <string>      
using namespace std; // 使用标准命名空间,避免频繁使用std::

class MyString : public string {  // 定义一个继承自string的自定义类MyString
public:
    void customFunction() {      // 定义自定义成员函数customFunction
        cout << "Custom function for MyString" << endl;  // 输出自定义信息
    }
};

int main()
{    // 主函数开始
    MyString customStr = "Custom String";  // 创建一个MyString类型的对象customStr,初始化为"Custom String"
    cout << customStr << endl;  // 输出customStr的内容
    customStr.customFunction();  // 调用customFunction方法,输出自定义信息

    return 0;  // 返回0,表示程序正常结束
}

        通过这篇博客,深入探索了C++中的string,了解了它相较于C语言字符串的优势。string提供了更安全、更方便以及更功能丰富的字符串处理方式,是现代C++编程中的强大工具。无论是拼接、赋值、遍历还是其他字符串操作,string都能显著地提升代码的可读性、可维护性和安全性。在日常的C++开发中,强烈推荐使用string来处理字符串,以获得更好的开发体验。

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

   手撕C语言

            玩转linux

                    脚踢数据结构

                            6818(ARM)开发板实战

📢写在最后

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

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

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

相关文章

SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)

在上一篇文章讲述zuul的时候&#xff0c;已经提到过&#xff0c;使用配置服务来保存各个服务的配置文件。它就是Spring Cloud Config。 一、简介 在分布式系统中&#xff0c;由于服务数量巨多&#xff0c;为了方便服务配置文件统一管理&#xff0c;实时更新&#xff0c;所以需…

Linux网络编程1(网络基础定义)

网络早已成为我们日常生活的一部分&#xff0c;经常使用互联网的人很难长时间内离开互联网。你是否好奇你的电脑仅仅插上一根网线&#xff0c;你发给朋友的聊天信息就能准确无误的到达朋友的手机或者电脑上&#xff0c;你是否好奇为何你仅仅在浏览器输入一个网址&#xff0c;点…

动态不确定性的动态S过程(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 7 Function callers标签页介绍

不知不觉这个code-mapping专题已经写了6篇文章了,今天是我们这个专题的最后一篇文章了介绍Function callers 这个其实很简单,以前的文章里也有提到CS接口实现两个SWC之间的CS调用,我们在从Code-mapping的角度在说下 首先还是看下模型 我们还记得在simulink里我们用function…

选择排序:用C语言打造高效的排序算法

本篇博客会讲解如何使用C语言实现选择排序。 下面我来画图讲解选择排序的思路。 假设有一个数组&#xff0c;其初始状态如下&#xff0c;我们想把这个数组排成升序。 首先我们标明范围&#xff0c;即[begin, end]&#xff0c;一开始begin(b)和end(e)分别表示数组的第一个位置…

【黑马头条之热点文章kafkaStream】

本笔记内容为黑马头条项目的热点文章-实时计算部分 目录 一、实时流式计算 1、概念 2、应用场景 3、技术方案选型 二、Kafka Stream 1、概述 2、Kafka Streams的关键概念 3、KStream 4、Kafka Stream入门案例编写 5、SpringBoot集成Kafka Stream 三、app端热点文章…

验证码识别DLL ,滑块识别SDK,OCR图片转文字,机器视觉找物品

验证码识别DLL ,滑块识别SDK 你们用过哪些OCR提取文字&#xff0c;识图DLL&#xff0c;比如Opencv,Labview机器视觉找物品之类&#xff1f;

数据库第十五课-------------非关系型数据库----------Redis

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

第三方软件测试都有哪些?

第三方软件测试 第三方软件测试是一种软件测试活动&#xff0c;旨在确保软件的质量、功能、性能和安全性等方面符合预期要求。 一、以下是一些常见的第三方软件测试类型&#xff1a; 兼容性测试&#xff1a;测试软件在不同操作系统、浏览器、数据库等环境下的兼容性。 功能测…

计费时间与非计费时间:工时表如何帮助你平衡两者?

正确分配时间是企业管理员工的必要条件&#xff0c;这意味着了解并了解如何管理计费时间和非计费时间。更重要的是&#xff0c;需要能够在两者之间找到适当的平衡&#xff0c;这样才能最大限度地提高生产力、消除业务中的低效率并提高利润。 什么是计费时间和非计费时间&#x…

Python“牵手”天眼查、企查查、启信宝企业数据API接口运用场景及功能介绍

天眼查企业信用查询app是一款企业数据信息查询软件&#xff0c;专注服务于个人与企业信息查询,是人人都在用的商业安全工具。本软件整合了国内所有企业数据信息&#xff0c;用户可以使用这款软件查询企业单位相关信息&#xff0c;只要在线输入企业名称&#xff0c;就可以为您搜…

网络互联与互联网 - TCP 协议详解

文章目录 1 概述2 TCP 传输控制协议2.1 报文格式2.2 三次握手&#xff0c;建立连接2.3 四次挥手&#xff0c;释放连接 3 扩展3.1 实验演示3.2 网工软考 1 概述 在 TCP/IP 协议簇 中有两个传输协议 TCP&#xff1a;Transmission Control Protocol&#xff0c;传输控制协议&…

每日后端面试5题 第八天

1.UDP和TCP协议的区别 1.UDP无连接&#xff0c;速度快&#xff0c;安全性低&#xff0c;适合高速传输、实时广播通信等。 2.TCP面向连接&#xff0c;速度慢&#xff0c;安全性高&#xff0c;适合传输质量要求高、大文件等的传输&#xff0c;比如邮件发送等。 &#xff08;还…

C语言学习系列-->【关于qsort函数的详解以及它的模拟实现】

文章目录 一、概述二、qsort函数参数介绍三、qsort实现排序3.1 qsort实现整型数组排序3.2 qsort实现结构体数组排序 四、模拟实现qsort函数 一、概述 对数组的元素进行排序 对数组中由 指向的元素进行排序&#xff0c;每个元素字节长&#xff0c;使用该函数确定顺序。 此函数使…

Vue中ElementUI结合transform使用时,发现弹框定位不准确问题

在近期开发中&#xff0c;需要将1920*1080放到更大像素大屏上演示&#xff0c;所以需要使用到transform来对页面进行缩放&#xff0c;但是此时发现弹框定位出错问题&#xff0c;无法准备定位到实际位置。 查看element-ui官方文档无果后&#xff0c;打算更换新的框架进行开发&am…

学校宿舍门禁:如何做好考勤管理?

随着科技的不断发展&#xff0c;传统的考勤方式逐渐显现出其局限性&#xff0c;而人脸识别技术作为一种快速、准确、无需直接接触的身份验证手段&#xff0c;为宿舍管理带来了全新的可能性。 宿舍管理能够让管理员随时通过系统监控宿舍内的人员流动情况&#xff0c;当系统检测到…

【Nginx】Nginx 简介

Ngnix 特点 模块化设计&#xff1a;良好的扩展性&#xff0c;可以通过模块方式进行功能扩展。高可靠性&#xff1a;主控进程和 worker 是同步实现的&#xff0c;一个 worker 出现问题&#xff0c;会立刻启动另一个 worker。内存消耗低&#xff1a;一万个长连接&#xff08;kee…

ASE 基础知识

笔记&#xff1a; 1&#xff0c;颜色&#xff0c;贴图 2&#xff0c;加减乘除 3&#xff0c;菲涅尔、sin&#xff0c;float、vector、time 4&#xff0c;漫反射&#xff0c;法线&#xff0c;自发光&#xff0c;金属度&#xff0c;反射&#xff0c;AO明暗&#xff0c;折射&#…

[保研/考研机试] KY190 查找第K小数 北京邮电大学复试上机题 C++实现

题目链接&#xff1a; 查找第K小数_牛客题霸_牛客网查找一个数组的第K小的数&#xff0c;注意同样大小算一样大。 如 2 1 3 4 5 2 第三小数。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692786918857 描述 查找一个数组的第K小的数&#xff0c;注意…