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

C++ string类—string修饰符、操作、非成员函数

一、Modifiers(修饰符):

1、operator+=

这个成员函数给一个string类类型的对象进行追加,在现有的string后面追加string类、字符串或者字符;

代码示例:

void test1()
{std::string s1("Hello ");std::cout << s1 << std::endl;//operator+= 追加s1 += "world";s1 += '!';std::cout << s1 << std::endl;std::string s2("Welcome!");s1 += s2;std::cout << s1 << std::endl;
}

2、append(追加)

这个成员函数也是在string后面追加;

(1)追加string类;(2)追加一个string类的一部分(从下标subpos开始到sublen个字符结束);(3)追加一个字符串;(4)追加一个字符串的前n个字符;(5)追加n个字符c;(6)追加一个string类的一部分,利用迭代器指明起始位置。

代码示例:

void test2()
{std::string s1("Who ");std::string s2("are *******");const char* s3 = "you";s1.append(s2, 0, 4);//4表示追加4个字符s1.append(s3);s1.append(1,'?');std::cout << s1 << std::endl;
}

3、push_back

给string类类型的字符串追加一个字符;

代码示例:

void test3()
{std::string s1("Good ");char c1 = 'L';char c2 = 'u';char c3 = 'c';char c4 = 'k';char c5 = '!';s1.push_back(c1);std::cout << s1 << std::endl;s1.push_back(c2);std::cout << s1 << std::endl;s1.push_back(c3);std::cout << s1 << std::endl;s1.push_back(c4);std::cout << s1 << std::endl;s1.push_back(c5);std::cout << s1 << std::endl;}

4、assign

 将内容分配给字符串;

 代码示例:

test(4)
{std::string str;std::string base = "The quick brown fox jumps over a lazy dog.";str.assign(base);std::cout << str << "\n";str.assign(base, 10, 9);//从第10个位置开始,向后扫描9个字符,assign进去std::cout << str << "\n";str.assign("programs are cool", 7);//字符串的前7个std::cout << str << "\n";str.assign("c-string");std::cout << str << "\n";str.assign(10, '*');std::cout << str << "\n";str.assign(base.begin() + 16, base.end() - 12);std::cout << str << "\n";
}

5、insert

在指定的下标位置之前插入字符串、字符或者string类; pos代表指定的下标位置;

代码示例:

void test5()
{std::string str = "Wrold";std::string s1 = "Hello ";str.insert(0, s1);std::cout << str << "\n";str.insert(str.size(), 1, '!');std::cout << str << "\n";
}

6、erase

删除string类对象里面的一部分字符; (1)默认从第一个字符开始,默认删除整个string类对象。传参控制删除的区间;(2)删除从p开始之后的内容;(3)利用迭代器指定区间(左闭右开),删除;

代码示例:

void test6()
{std::string str("There is nothing.");std::cout << str << "\n";str.erase(9);//从下标为9的字符删除完std::cout << str << std::endl;str.erase(str.begin(), str.end() - 3);std::cout << str << "\n";str.erase(str.begin() + 1);std::cout << str << "\n";
}

7、replace

对于一个string类对象,指定它某一个字符下标为起始位置,扫描len个长度的字符,替换成给出的字符串、字符、string类; 迭代器指定的区域左闭右开;

代码示例:

void test7()
{std::string str("xxxxx_yyyyy");str.replace(0, 3, "y");std::cout << str << std::endl;str.replace(str.begin() + 4, str.end(), "x");std::cout << str << std::endl;
}

8、swap

交换两个string类对象 ;

代码示例:

void test8()
{std::string s1("xxx");std::string s2("***");s1.swap(s2);std::cout << s1 << "\n" << s2 << std::endl;
}

9、pop_back

尾删一个string类对象的一个字符;

代码示例:

{std::string str("ABCDEFG");str.pop_back();str.pop_back();std::cout << str << std::endl;
}


二、string类对象操作

1、c_str

用来接收一个string的对象指针,这个指针指向字符串开头的位置,返回一个const char* 的指针;

代码示例:

void test1()
{string str("This is an apple");const char* cstr = str.c_str();cout << cstr << endl;cout << str<< endl;
}

2、data

与c_str用法类似 ;

3、copy

拷贝一个string类对象的一个子串给一个由s指向的字符串;从pos开始拷贝,拷贝len个字符,若是stirng不够拷贝,那就拷贝整个stirng类对象;

代码示例:

//copy
void test2()
{string str("everything is nice");char buffer[20];size_t _length = str.copy(buffer,10,0);buffer[_length] = '\0';cout << buffer << endl;
}

 4、find

从一个string类对象里面找字符串、字符或者string对象,找到了返回开始匹配的下标;没有找到返回string::npos

(3)意为从string的pos1下标开始找,找与s里面前n个开始匹配的位置;

代码示例:

//find
void test3()
{string str("Hello World!");size_t pos1 = str.find('!', 0);size_t pos2 = str.find("Hello", 0);string str2("World");size_t pos3 = str.find(str2, 0);cout << pos1 << " " << pos2 << " " << pos3 << endl;size_t pos4 = str.find(" World", 0, 3);cout << pos4 << endl;
}

5、refind

和find原理相同,只是从最后倒着开始找;

6、find_first_of 和find_last_of

find_first_of 意为按正向顺序查早,查找string类中与给出的查找对象中任意字符匹配的下标; 

代码示例:

//find_first_of
void test4()
{string str("Please, replace the vowels in this sentence by asterisks.");size_t pos = str.find_first_of("aeiou");//从下标为0处开始,在str中找与"aeiou"中任意字符匹配的下标while (pos!= string::npos){str[pos] = '*';pos = str.find_first_of("aeiou", pos + 1);//指明开始查找的位置,以免重复查找已查找的位置}//最后str里面的"aeiou"全部被替换成'*'cout << str << endl;
}

find_last_of和 find_first_of原理相同,只是从后面开始查找起;

7、find_first_not_of 和find_last_not_of  

查找string类中不为给出查找对象中任意字符的位置;

代码示例:

void test5()
{string str("Please, replace the vowels in this sentence by asterisks.");size_t pos = str.find_first_not_of("aeiou");while (pos != string::npos){str[pos] = '*';pos = str.find_first_not_of("aeiou", pos + 1);}cout << str << endl;
}

 find_last_not_of从后面开始查找

8、substr

从一个string对象中拷贝一个子串,从pos开始拷贝,拷贝len个字符,返回string类的子串

代码示例:

void test6()
{string str("What a nice day!");string _substr = str.substr(0, 10);cout << _substr << endl;
}


三、string类模板中的非成员函数

成员函数默认第一个参数是this指针,传参时也不能改变,而有些函数的传参第一个实参不一定是this指针指向的对象,因此要将这些函数定义在类外,方便传参;

1、operator+

此函数可以将string、字符或者字符串之间相加;

代码实现:

//operator+
void test7()
{string str = "www";const char* s1 = "cplusplus";char i = '.';string s2 = "com";string rsl;rsl = str + i + s1 + i + s2;cout << rsl << endl;
}

 

2、relational operators

此函数中定义了string对象之间的比较;

代码示例:

//relational operators
void test8()
{// string comparisonsstd::string foo = "alpha";std::string bar = "beta";if (foo == bar) std::cout << "foo and bar are equal\n";if (foo != bar) std::cout << "foo and bar are not equal\n";if (foo < bar) std::cout << "foo is less than bar\n";if (foo > bar) std::cout << "foo is greater than bar\n";if (foo <= bar) std::cout << "foo is less than or equal to bar\n";if (foo >= bar) std::cout << "foo is greater than or equal to bar\n";
}

 3、swap

交换两个string类对象:

4、operator<< 和 operator>>

重载输出和输入函数;

第一个参数是cout或者cin,这也符合代码标准输入输出流的书写;

代码示例:

//operator<< 、operator>>
void test9()
{string str;cin >> str;cout << str;cout << endl;string str2 = "ancd";cout << str2;
}

5、getline

此函数是输入string的;对于一般的输入cin来说,碰见空格就说明输入完成,但是有些情况要把空格以及空格之后的字符也算成这个string类;

一般来说(也就是(2)),碰见'\n'也就是换行就会终止;若是在第三个参数指明了终止的字符,那么就一直读取,直到碰见这个指定的字符才结束;

getline不会读取结束标志的字符,而是将它作为'\0'读取进入string;

代码示例: 

	string str1;cout << "输入一个字符串:";//输入一个含空字符的字符串,cin只能读取空字符前面的内容cin >> str1;cout << str1 << endl;

  只能读取空字符前面的内容;

	cout << "输入一个字符串:";string str2;getline(cin, str2);//默认碰见'\n'结束cout << str2;

getline遇到换行符结束;

	cout << "输入一个字符串:";string str3;getline(cin, str3, 'Z');//指定碰见'Z'结束cout << "**********************";cout << str3;

 碰见'Z',才结束读取,换行符也读;

相关文章:

C++ string类—string修饰符、操作、非成员函数

一、Modifiers&#xff08;修饰符&#xff09;&#xff1a; 1、operator 这个成员函数给一个string类类型的对象进行追加&#xff0c;在现有的string后面追加string类、字符串或者字符&#xff1b; 代码示例&#xff1a; void test1() {std::string s1("Hello ");…...

PVN3D(一)代码框架

在windows上配置pvn3d的环境一直配不成功&#xff0c;主要卡在了与C联合编译上&#xff0c;不知道如何处理了。索性先看看代码&#xff0c;竟然发现与论文中的代码对应上了。希望这一段时间把环境配置好。 1.论文中的网络结构 1.RGB图像特征&#xff0c;通过CNN提取特征。深度…...

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究

「OC」剪不断&#xff0c;理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 文章目录 「OC」剪不断&#xff0c;理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究前言介绍UIResponderUIGestureRecognizerUIControl 正文UIGestur…...

GitHub Copilot的详细介绍

目录 主要功能&#xff1a; 示例用法&#xff1a; GitHub Copilot 的优缺点&#xff1a; 优点&#xff1a; 缺点&#xff1a; 如何使用 GitHub Copilot&#xff1f; 总结&#xff1a; GitHub Copilot 是一种基于人工智能的编程助手&#xff0c;由 GitHub 和 OpenAI 联合…...

opencv之阈值处理

文章目录 1. 阈值处理2. 阈值处理的基本原理3. 常见的阈值处理方法3.1 全局阈值&#xff08;Global Thresholding&#xff09;:3.2 自适应阈值&#xff08;Adaptive Thresholding&#xff09;:3.2.1 工作原理3.2.2 工作步骤3.2.3 适用场景3.2.4 优缺点自适应阈值的优点自适应阈…...

oracle startup失败,ORA-01078: failure in processing system parameters

SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file /data/oracle/product/11.2.0/db_1/dbs/initorc1.ora 出错的原因可能是&#xff1a;文件名字不正确&#xff0c;文件权限不对&#xff0c;文件不存在&#x…...

【python因果推断库7】使用 pymc 模型的工具变量建模 (IV)2

目录 与普通最小二乘法 (OLS) 的比较 应用理论&#xff1a;政治制度与GDP 拟合模型&#xff1a;贝叶斯方法 多变量结果和相关性度量 结论 与普通最小二乘法 (OLS) 的比较 simple_ols_reg sk_lin_reg().fit(X.reshape(-1, 1), y)print("Intercept:", simple_ols_…...

【2024数模国赛赛题思路公开】国赛B题思路丨附可运行代码丨无偿自提

2024年国赛B题解题思路 问题 1: 抽样检测方案设计 【题目分析】 分析&#xff1a; 目标是设计一个高效的抽样检测方案&#xff0c;在尽量少的样本数量下&#xff0c;确保在高信度水平下做出正确的接受或拒收决策。需要处理两个不同的信度要求&#xff0c;这对样本量的计算提…...

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;KNN分类器&#xff09; 文章目录 一、基本原理原理流程举个例子总结 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#x…...

使用udp进行通信

UDP chat 头文件 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time…...

C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作

C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作 一、使用Microsoft.Office.Interop.Excel库 1、通过NuGet包管理器添加引用 按照下图中红框所示进行操作。 需要安装Microsoft.Office.Interop.Excel包 添加Microsoft Office 16.0 Object …...

java重点学习-redis

一.redis 穿透无中生有key&#xff0c;布隆过滤nul隔离 锁与非期解难题。缓存击穿过期key&#xff0c; 雪崩大量过期key&#xff0c;过期时间要随机。 面试必考三兄弟&#xff0c;可用限流来保底。 1.1 Redis的使用场景 根据自己简历上的业务进行回答 缓存穿透、击穿、雪崩、双…...

每日刷题(图论)

P1119 灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 看数据范围知道需要用到Floyd算法&#xff0c;但是道路是不能直接用的&#xff0c;需要等到连接道路的两个村庄重建好才可以使用&#xff0c;所以这需要按照时间依次加入中转点&#xff0c…...

Requestium - 将Requests和Selenium合并在一起的自动化测试工具

Requests 是 Python 的第三方库&#xff0c;主要用于发送 http 请求&#xff0c;常用于接口自动化测试等。 Selenium 是一个用于 Web 应用程序的自动化测试工具。Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 本篇介绍一款将 Requests 和 Seleniu…...

mysql和pg等数据库之间的数据迁移实战分享

mysql和pg等数据库之间的数据迁移是常见的问题&#xff1a;比如一开始使用Oracle&#xff0c;后来想使用mysql&#xff0c;而且需要把Oracle数据库的数据迁移到mysql里面&#xff1b;后期有想使用pg数据库&#xff0c;同时需要把Mysql数据库的数据迁移到pgl里面&#xff0c;等等…...

消息中间件都有哪些

RabbitMQ&#xff1a;这可是一个开源的消息代理软件&#xff0c;也叫消息中间件。它支持多种消息传递协议&#xff0c;可以轻松地在分布式系统中进行可靠的消息传递。 Kafka&#xff1a;Apache Kafka是一个分布式流处理平台&#xff0c;它主要用于处理实时数据流。Kafka的设计初…...

数据结构(3)内核链表

一、内核链表 内核链表是一种在操作系统内核中使用的数据结构&#xff0c;主要用于管理和组织内核对象。它是有头双向链表的一种实现。 内核链表的特点 双向链表: 内核链表的每个节点都包含指向前一个节点和后一个节点的指针&#xff0c;这使得在链表中进行插入和删除操作时更…...

Linux 硬件学习 s3c2440 arm920t蜂鸣器

1.查找手册时钟图&#xff0c;输入12m想要通过pll得到400m的信号 2.对比pll值&#xff0c;找到最近的为405&#xff0c;得到pll中mdiv为127&#xff0c;pdiv为2&#xff0c;sdiv为1 3.想要得到fclk400&#xff0c;hclk100&#xff0c;pclk50&#xff0c;对比分频比例&#xff0…...

提交保存,要做重复请求拦截,避免出现重复保存的问题

**问题&#xff1a;**前端ajax提交数据的时候&#xff0c;当频繁点击的时候&#xff0c;或者两个账号以相同数据创建的时候&#xff0c;会出现问题。 **处理办法&#xff1a;**前端拦截&#xff0c;防止重复提交数据&#xff0c;在上一次请求返回结果之后才允许提交第二次&…...

华为 HCIP-Datacom H12-821 题库 (3)

有需要题库的可以看主页置顶​​​​​​​ 1.运行 OSPF 协议的路由器在交互 DD 报文时&#xff0c;会使用以下哪一个参数选举主从关系&#xff1f; A、接口的 IP 地址 B、接口的 DR 优先级 C、Area ID D、Router ID 答案&#xff1a;D 解析&#xff1a; Router-ID 大的为主&a…...

OpenClaw技能扩展教程:Qwen3-14b_int4_awq实现公众号自动发布

OpenClaw技能扩展教程&#xff1a;Qwen3-14b_int4_awq实现公众号自动发布 1. 为什么需要自动化公众号发布 作为一个技术博主&#xff0c;我每周都要在公众号上发布2-3篇技术文章。最让我头疼的不是写作本身&#xff0c;而是发布前的繁琐流程&#xff1a;手动排版Markdown、设…...

出海行业热点 | Apple推新款“Ultra”高端产品;Google取消30%分成,开放第三方商店;阿里云登陆MWC,支持众多中国企业出海;

- 热点总览&#xff08;3.3~3.9&#xff09; -1. 印尼拟限未成年人用社媒2. Apple推新款“Ultra”高端产品3. Apple限制美区下载ByteDance应用4. Google取消30%分成&#xff0c;开放第三方商店5. 月流水有望过千万&#xff0c;三七开年找到了新爆款6. 阿里云登陆MWC&#xff0c…...

【PHP低代码表单安全生死线】:92%开发者忽略的3类注入漏洞(含OWASP Top 10映射表+自动检测脚本)

第一章&#xff1a;PHP低代码表单安全生死线总览在低代码开发范式下&#xff0c;PHP 表单常被封装为可拖拽、自动生成的组件&#xff0c;但其底层仍依赖 $_POST、$_GET 等超全局变量接收用户输入。这种便利性极易掩盖注入、XSS、CSRF 和越权提交等高危风险——一条未过滤的 $_P…...

粉紫系超人气月兔铃仙仁

1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时&#xff0c;OpenSpec 会提示你选择使用的 AI 工具&#xff08;Claude Code、Cursor、Trae、Qoder 等&#xff09;。 3 O…...

2026年AI热点:阿里新模型领跑行业

今日AI热点汇总&#xff08;2026年4月9日&#xff09; 一、阿里发布新模型&#xff0c;性能大幅提升 今天&#xff0c;阿里巴巴重磅推出了全新的通义千问模型&#xff0c;这个新模型在语言理解、逻辑推理和代码生成等方面都有了显著提升。 更强的理解能力&#xff1a;能更准确地…...

OpenClaw技能调试技巧:千问3.5-35B-A3B-FP8任务失败的日志分析方法

OpenClaw技能调试技巧&#xff1a;千问3.5-35B-A3B-FP8任务失败的日志分析方法 1. 问题背景与调试困境 上周我尝试用OpenClaw对接千问3.5-35B-A3B-FP8模型实现一个自动化流程&#xff1a;让AI助手读取截图中的文字内容&#xff0c;整理成结构化数据后存入本地Excel文件。结果…...

使用 Python 操作 Excel 文件中的工作表(添加和删除)

在处理复杂的 Excel 文档时&#xff0c;工作表的管理是一项基础而重要的技能。无论是需要为不同部门创建独立的数据表格&#xff0c;还是清理不再需要的旧数据&#xff0c;灵活地添加和删除工作表都能帮助我们更好地组织和管理数据。 本文将介绍如何使用 Python 和 Spire.XLS 库…...

springcloud-alibaba基于springcloud的电子商城系统_80k11211_zl047

前言 基于Spring Cloud的电子商城系统是面向现代电商场景的分布式微服务解决方案&#xff0c;旨在解决传统单体架构在高并发、可扩展性、灵活性等方面的瓶颈一、项目介绍 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;to…...

感应电机与异步电机定子匝间短路的仿真研究——基于MATLAB Simulink

感应电机 异步电机定子匝间短路仿真 matlab simulink啪嗒一声按下启动键&#xff0c;车间里那台老旧的异步电机突然发出刺耳的蜂鸣声。作为设备维护的老油条&#xff0c;我抄起万用表就往定子绕组上怼——果然&#xff0c;又是该死的匝间短路在作妖。这玩意就像电机的心脏早搏&…...

YOLOE官版镜像快速部署指南:5分钟搞定开放词汇目标检测环境

YOLOE官版镜像快速部署指南&#xff1a;5分钟搞定开放词汇目标检测环境 1. 引言&#xff1a;为什么选择YOLOE官版镜像 在计算机视觉领域&#xff0c;目标检测技术已经发展得相当成熟。然而&#xff0c;传统模型如YOLOv5/v8存在一个明显局限——它们只能识别训练时见过的固定类…...