从零开始的C++学习生活 6:string的入门使用

Dev-C++入门指南:从零开始编写你的第一个C++程序 集成开发环境(IDE)是程序员编写、编译和调试代码的核心工具,其原理在于将编辑器、编译器和调试器集成在一个软件中,极大提升了开发效率。对于C++初学者而言,选择一款轻量级、易于上手的IDE至关重要,它能帮助学习者聚焦于语言本身,而非复杂的配置过程。Dev-C++作为一款经典的Windows平台C/C++ IDE,内置MinGW GCC编译器,实现了安装即用,无需额外配置,为新手提供了平滑的学习曲线。通过理解预处理指令、命名空间、主函数等核心概念,并实践从“Hello, World!”到交互式小程序的编写,开 阅读详情

个人主页:Yupureki-CSDN博客

C++专栏:C++_Yupureki的博客-CSDN博客

目录

前言

1. 为什么学习string类?

1.1 C语言字符串的局限性

1.2 字符串的重要性

2. 标准库中的string类

2.1 string类基础

2.2 C++11新特性:auto和范围for

auto关键字

范围for循环

3. string基本操作

构造字符串

容量操作

4 string访问和遍历

访问

遍历

5. string的修改操作

6. string类的模拟实现

6.1 浅拷贝问题

6.2 深拷贝解决方案

结语


前言

在C++编程中,字符串处理是我们日常开发中最常见的任务之一。C语言中,我们使用字符数组和\0结尾的方式来处理字符串,但这种方式存在诸多不便:需要手动管理内存、容易发生越界访问、功能有限且不符合面向对象的思想。

C++标准库中的string类彻底改变了这一局面,它封装了字符串的存储和操作,提供了丰富而安全的接口,让我们能够更加高效、安全地处理字符串。无论是算法竞赛、日常开发还是面试求职,string类都是我们必须掌握的重要工具。

本文将全面介绍C++ string类的使用方法和实现原理,帮助大家深入理解并熟练运用这个强大的工具。

1. 为什么学习string类?

1.1 C语言字符串的局限性

在C语言中,字符串是以\0结尾的字符数组,虽然标准库提供了一系列字符串操作函数,但存在明显问题:

char str[20] = "hello";
strcat(str, " world");  // 需要确保数组足够大,否则可能越界

并且在C语言中,字符串的处理相关的函数极少。如果现在我要求你对"hello world"进行以下操作:在'e'前面插入5个'x',删除第一个'l',找到字符串中第一个'o',删除所有的' ',最后将字符串再改回"hello world"。你看到这,似乎并不是很难,但是特别麻烦。每一个要求都需要十几行的代码,如果加在一起便十分复杂。

那么string就解决了这个问题,因为集成了我们所需的几乎所有处理字符串的操作函数

1.2 字符串的重要性

https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&&tqId=11202&rp=6&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

https://leetcode-cn.com/problems/add-strings/

在OJ中,有关字符串的题目基本以string类的形式出现,并且在竞赛中,对于字符串的处理也十分频繁,如果在C中死板的一行行写,那么就十分低效

2. 标准库中的string类

2.1 string类基础

string为C++中十分重要的一个板块,为此我们专门在专业的C++相关文档中查阅并讲解

http://www.cplusplus.com/reference/string/string/?kw=string

同时在使用string类时,必须包含#include头文件以及using namespace std;

2.2 C++11新特性:auto和范围for

auto关键字

auto让编译器自动推导变量类型,使代码更简洁

 int main()
 {
 int a = 10;
 auto b = a;
 auto c = 'a';//auto根据赋值的类型,自动推导变量的类型,因此auto的变量必须初始化
 auto d = func1()
}

范围for循环

使用auto简化容器遍历:

string str = "hello";
// 传统遍历
for (size_t i = 0; i < str.size(); ++i) {
    cout << str[i];
}

// 范围for遍历
for (auto ch : str) {
    cout << ch;  // 自动遍历每个字符
}

// 如果需要修改字符串,使用引用
for (auto& ch : str) {
    ch = toupper(ch);  // 将字符转为大写
}

3. string基本操作

构造字符串

string是个类,因此具有构造函数

string s1;              // 空字符串
string s2("hello");     // 用C字符串构造
string s3(s2);          // 拷贝构造
string s4(5, 'A');      // "AAAAA"
string s5 = "world";    // 赋值构造

容量操作

函数名称

size(重点)   返回字符串有效字符长度

length    返回字符串有效字符长度

capacity   返回空间总大小

empty (重点)  检测字符串释放为空串,是返回true,否则返回false

clear (重点)  清空有效字符

reserve (重点)为字符串预留空间**

resize (重点)  将有效字符的个数该成n个,多出的空间用字符c填充

string str = "hello";
cout << str.size();     // 5,返回有效字符长度
cout << str.length();   // 5,与size()相同
cout << str.capacity(); // 返回总容量
cout << str.empty();    // 是否为空

str.clear();            // 清空字符串
str.resize(10, 'x');    // 调整大小,多出部分用'x'填充
str.reserve(100);       // 预留空间,提高效率

4 string访问和遍历

访问

string重载了operator[],使其能够像操作数组一样利用[]来访问元素

int main ()
{
  std::string str ("Test string");
  for (int i=0; i<str.length(); ++i)
  {
    std::cout << str[i];//利用[]和下标来访问元素
  }
  return 0;
}

遍历


begin和end

begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器

string str = "hello";


// 迭代器
for (auto it = str.begin(); it != str.end(); ++it) {
    cout << *it;//从左到右访问->hello
}

rbegin和rend

rbegin获取一个字符的反向迭代器 + rend获取第一个字符的位置

string str("hello")
for (auto it = str.rbegin(); it != str.rend(); ++it) {
    cout << *it;//从右往左访问->olleh
}
str.push_back('!');     // 尾部添加字符

5. string的修改操作

函数名称 功能说明

push_back 在字符串后尾插字符c

str.push_back('!');     // 尾部添加字符

append  在字符串后追加一个字符串

str.append(" world");   // 追加字符串

operator+= (重点)  在字符串后追加字符串str

str += "!!!";           // 最常用的追加方式

c_str(重点) 返回C格式字符串

find(重点) 从字符串pos位置开始往后找字符c/字符串,返回该字符在字符串中的位置

size_t pos = str.find("world");    // 查找子串

rfind (重点) 从字符串pos位置开始往前找字符c/字符串,返回该字符在字符串中的位置

substr   在str中从pos位置开始,截取n个字符,然后将其返

if (pos != string::npos) {
    string sub = str.substr(pos, 5); // 截取子串
}

erase 删除子串

str.erase(5, 4);// 删除子串(从起始地点为5的位置开始删除4个字符)

6. string类的模拟实现

6.1 浅拷贝问题

浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致 多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉

class String {
private:
    char* _str;
public:
    String(const char* str = "") {
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }
    
    // 问题:默认拷贝构造是浅拷贝!
    ~String() { delete[] _str; }
};

void Test() {
    String s1("hello");
    String s2(s1);  // 浅拷贝!s1和s2指向同一内存
} // 析构时同一内存被释放两次,程序崩溃

6.2 深拷贝解决方案

如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给 出。一般情况都是按照深拷贝方式提供。

class String {
public:
    String(const char* str = "") {
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }
    
    // 深拷贝构造
    String(const String& s) {
        _str = new char[strlen(s._str) + 1];
        strcpy(_str, s._str);
    }
    
    // 深拷贝赋值
    String& operator=(const String& s) {
        if (this != &s) {
            char* temp = new char[strlen(s._str) + 1];
            strcpy(temp, s._str);
            delete[] _str;
            _str = temp;
        }
        return *this;
    }
    
    ~String() { delete[] _str; }
    
private:
    char* _str;
};

现代写法(推荐)

class String {
public:
    String(const char* str = "") {
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }
    
    // 拷贝构造:利用临时对象和swap
    String(const String& s) : _str(nullptr) {
        String temp(s._str);
        swap(_str, temp._str);
    }
    
    // 赋值:参数为值传递,利用swap
    String& operator=(String s) {
        swap(_str, s._str);
        return *this;
    }
    
    ~String() { delete[] _str; }
    
private:
    char* _str;
};

结语

string类是C++中极其重要的组件,它让我们能够更加安全、高效地处理字符串。通过本文的学习,希望大家能够:

  1. 熟练掌握string类的各种常用接口

  2. 理解深拷贝和浅拷贝的区别及重要性

  3. 能够自己实现一个简单的string类

  4. 在实战中灵活运用string解决各种字符串问题

练习建议:

  • 实现自己的String类(包含基本操作)

  • 完成leetcode上的字符串相关题目

  • 阅读标准库中string的源码实现

【深度剖析】三一重工的数字化转型(中篇) 三一重工在数字化转型方面取得了提高效率、降低成本、加强研发创新和改善内控管理等多方面的成效。本研究旨在通过对三一重工数字化转型的深入分析,引导企业思考在第四次工业革命与第三次能源革命交汇的超级技术窗口期,如何进一步把握发展机遇,并为同行业其他企业提供探索性的建议。作为装备制造行业的佼佼者,三一重工的数字化转型受到了业界的广泛关注。作为行业内首批接触并实践数字化转型的企业之一,三一重工的转型经验不仅成功,而且积累了丰富的理论与实践,为其他制造业企业的数字化转型提供了可借鉴的范例。 阅读详情

相关推荐

【鸿蒙游戏上架审核规范指南】

华为鸿蒙游戏上架审核规范指南摘要

weixin_44161102的博客 894

从零开始:C++ String类的模拟实现

在这篇博客中,我们从零开始,逐步实现了一个自定义的 C++ String 类。通过这个过程,我们不仅深入了解了字符串操作的内部工作原理,还掌握了许多 C++ 编程的重要概念和技巧。类的基本结构我们定义了 String 类的基本结构,包括私有成员变量和公共成员函数。我们了解了如何封装数据,保护类的内部实现细节,并提供一个干净的公共接口。构造函数和析构函数我们实现了默认构造函数、拷贝构造函数、移动构造函数和析构函数,确保我们的 String 类能够正确地初始化、复制、移动和销毁对象。

2301_79969994的博客 1563

lvds接口_LVDS,接口,时序讲解,非常好的文章

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群1.1.1 LVDS接口分类1.1.1.1 单路6bit LVDS这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。1.1.1.2 双路6bit LVDS这种接口电...

weixin_39639286的博客 1888

【C++杂货铺】详解string

【C++杂货铺】详解string。欢迎观看本期【C++杂货铺】,本期内容将详解string,包含了解string,如何操作string,最后会模拟实现string。

jupangMZ的博客 2727

一文看懂—Agent多智能体协作

多智能体协作已成为AI应对复杂任务的关键范式,通过模拟人类团队分工,实现专业化、高效化和纠错能力。本文系统阐述了多智能体协作的核心概念(智能体分工、工作流编排、工具使用)、与产品规划的关联(任务拆解、错误处理、组织架构设计),以及典型应用场景(报告生成、客服工单、学习规划)。同时剖析了常见陷阱(循环卡死、信息失真、成本失控)及解决方案,并提供了实用工具模板(角色定义卡、工作流画布、成本仪表盘)。最后通过市场竞品分析和旅行规划两个实战案例,展示了多智能体协作的实际价值。该技术正推动AI从单点智能迈向系统智能,

lee006006的博客 1020

sdc时钟约束2——多驱动时钟

sdc 多驱动时钟 master_clock

qq_40411444的博客 5519

从零开始学C++:string类

本文系统介绍了C++中的string类,对比C风格字符串,指出string类在内存管理、安全性、操作便利性等方面的优势。详细讲解了string类的构造方法、容量操作、访问遍历、修改操作等核心功能,并强调深拷贝与浅拷贝的区别。通过模拟实现string类,深入剖析了其底层原理。string类作为STL重要组件,掌握其使用能显著提升C++编程效率和安全性,是C++开发者必须熟练掌握的核心技能。

qq_58741420的博客 1170

【雷达图】R语言绘制雷达图(ggradar),NBA季后赛数据为例

一起用R语言给nba球星画球技雷达图吧!

池塘春草梦的博客 6243

从零开始的C++编程 5 (string上)

3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, charc)用字符c来填充多出的元素空间。C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

wangzhezhifwng的博客 803

基于JavaFX的Http Server模拟器

源码地址 GitHub - DayRain/http-server-simulator: http server 模拟器 功能描述 HttpServer模拟器,通过简单的配置即可模拟第三方服务端,用于接收和响应HTTP请求。 支持同时模拟多个服务、动态添加接口、动态配置返回值。 使用说明 运行 exe运行 编译代码后,点击exe直接运行 代码运行 下载好代码后,运行主类ApplicationStarter即可 新建服务 主界面如下 点击 文件-新建 创建新的服务 ...

小楼夜听雨的博客 2517

AD2428与SigmaStudio:从节点自动配置与EEPROM存储实战

本文详细介绍了AD2428 A2B收发器与SigmaStudio开发环境的集成应用,重点讲解从节点自动配置与EEPROM存储的实战流程。通过硬件连接、属性配置、数据导出及嵌入式系统集成等步骤,实现设备上电自启动,提升汽车音频系统的可靠性与部署效率。

g8f9d0s1a2的博客 647

Re:从零开始的 C++ STL篇(一)万字干货!全站最全的std::string 全面解析与硬核指南(上)

C++ 标准库中的 std::string 是处理文本数据不可或缺的核心组件。本文旨在提供一份全面而深入的学习指南,带领读者从 string 的基本概念出发,逐步掌握其精髓。 文章首先阐述了 string 的定义、作用以及所需包含的 <string> 头文件,并借助图表直观展示其内部可能的结构。紧接着,探讨了字符串编码(特别是 UTF-8)与 string 存储的关系,帮助理解字符是如何被表示和存储的。 核心部分围绕 string 的常用功能展开: 对象管理: 详述了构造、拷贝构造、赋值 (operator

小此方的博客 1691

使用微信小程序开发制作一个简单的在线问答应用

以上就是一个简单的在线问答小程序的开发过程。其中包括前端界面的布局和逻辑,后端接口的设计和实现,以及部署和测试的步骤。通过以上步骤,你可以自己尝试开发一个类似的在线问答应用。

2401_85258012的博客 782

cpp之模拟实现string(上)

private://类内部私有成员要给缺省值注意:1.一般声明中有资源申请时,⼀定要自己写析构(对于内置类型编译器不做处理,这就导 致资源泄露)2.一般写了析构也需写拷贝构造和赋值3.既然要写拷贝构造,那我们声明成员是最好给缺省值,因为拷贝构造(也是构造,它的成员也需要初始化) 不过我们一般不写初始化列表,没有初始化列表编译器则按声明位置给缺省值size_t size() const {//this指向的内容无需修改,加上const。

2301_79811770的博客 777

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【C++ STL string :深入浅出 从入门到实战】

本文深入讲解了C++ STL中的string类,对比了其与C风格字符串的优势,包括安全性、开发效率、功能集成、内存优化和生态兼容性。文章详细介绍了string的初始化、拼接、访问、查找替换、子串提取等基础与进阶操作,并展示了如何与STL算法协同工作。通过实际代码示例,帮助开发者掌握这一现代化字符串处理工具,提升文本操作的效率与安全性。适合C++初学者和需要优化字符串处理的开发者阅读学习。

Sunfor_sun的博客 1053

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++【string篇1遍历方式】:从零开始到熟悉使用string类

接上回讲到string类的构造,string的构造方式很多,取决于自己怎么使用,本篇博客将会继续深入学习string类。通过文档的方式来继续了解string的更多用法。

moxuezhendecai的博客 472

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

用llama.cpp实战入门C++:Windows下从编译到CUDA加速

C++是一门强调内存控制与系统交互的编程语言,其核心在于理解编译构建、运行时依赖、指针与RAII等底层机制。llama.cpp作为纯C++实现的轻量级大模型推理框架,以约3万行聚焦代码提供了极佳的学习沙盒——它不抽象、不封装,让std::vector、struct、CMakeLists.txt、Visual C++ Redistributable等概念在真实报错与调试中自然浮现。通过在Windows 11下配置VS2022、编译CLI工具、启用CUDA加速及加载qwen3-embedding模型,学习者可同

weixin_30235225的博客 500

从零开始学习cpp-sort:构建高效C++排序系统的完整路径

cpp-sort是一个功能强大的C++17排序库,提供了丰富的排序算法和相关工具,帮助开发者构建高效的排序系统。本文将从基础概念到实际应用,全面介绍cpp-sort的使用方法和核心功能,让你快速掌握这个强大的排序工具。 ## 🌟 什么是cpp-sort? cpp-sort是一个通用的C++17头文件库,专注于排序算法的实现和优化。它提供了多种排序算法、排序适配器、比较器和相关工具,旨在满足不

gitblog_00773的博客 284

【从零开始学c++】——string

学好STL一.STL简介(了解)1.什么是STL2.STL的六大组件3.STL的缺陷2.string1.string的简单了解如何对stl的查阅2. string常用接口说明1.string类 对象常见的构造2.string类对象的容量操作3. string类对象的访问及遍历操作4. string类对象的修改操作 一.STL简介(了解) 1.什么是STL STL(standard template libaray-标准模板库): 是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且 是一个包罗数据.

sjp11的博客 474

从零开始c++精讲:第五篇——String

C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

m0_57180439的博客 969

C++从零开始(day14)——string类学习使用

这是关于一个普通双非本科大一学生的C++的学习记录贴在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料那么开启正题今天分享的内容是string类这里给上官方的文档链接,有需要的可以看看下面介绍string类的常用接口。

2301_80764270的博客 760

C++字符串完全入门:从零开始掌握string类

如果想做个带交互的字符串处理网页应用,平台的一键部署功能简直神器——我把之前的密码验证程序改成交互式网页,点几下就发布成可访问的链接,不用折腾服务器配置。建议每个环节都动手试试,string类的各种方法用起来比看理论直观多了。string类作为C++标准库的重要部分,比传统C风格字符串更安全易用。今天就用最直白的语言,带你从零吃透string类的核心用法。上可以立即实践,它的在线编辑器支持C++环境配置,写完代码点运行就能看到效果,特别适合新手做这种语法练习。// 取前3字符"wor"find("子串")

GoldenleafRaven13的博客 572

【C++】模拟实现string类

对string类的模拟实现

dab112的博客 2082

【从零开始的C++学习生活】string类的常用接口的使用和简单模拟实现

本文介绍了c++中string类的常用接口和简单实现

m0_74949888的博客 164

从零开始的C++之旅——string类的模拟实现

string类型的成员变量其实跟我们之前数据结构定义的顺序表十分相似,同时一些操作的实现也与顺序表类似,因此实现方式也基本类似,无非就是多了类和对象的相关只是,在实现string类的过程中也可以帮助我们对c++的一些相关知识有更好的掌握既然和顺序表类似类似,那么其自然是三个成员变量,一个是大小size,一个是存储空间大小capacity,一个是char*类型的指针。

2302_81813630的博客 1446

【从零开始的C++学习生活】带你了解string的深浅拷贝

本文主要讨论了C++中string类的深浅拷贝问题。浅拷贝会导致两个对象互相干扰,而深拷贝则会创建一个新的对象,使得两个对象互相独立。为了避免不安全的结果,应该使用拷贝构造函数或者赋值运算符来进行深拷贝。在进行深拷贝时,需要保证两个对象互相独立,互不干扰。

m0_74949888的博客 198
上一篇: 从零开始的C++学习生活 5:内存管理和模板初阶
下一篇: 从零开始的C++学习生活 7:vector的入门使用
Yupureki
博客等级 码龄6年 684粉丝 108原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值