C++ 的 string构造函数

C++ 使用介绍技巧大全 C++使用技巧大全 阅读详情

之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 
担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 
进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 

首先,为了在我们的程序中使用string类型,我们必须包含头文件 <string>。如下: 
#include <string> //注意这里不是string.h string.h是C字符串头文件 

1.声明一个C++字符串 
声明一个字符串变量很简单: 
string Str; 
这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下: 

a) string s; //生成一个空字符串s 
b) string s(str) //拷贝构造函数 生成str的复制品 
c) string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值 
d) string s(str,stridx,strlen) //将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值 
e) string s(cstr) //将C字符串作为s的初值 
f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 
g) string s(num,c) //生成一个字符串,包含num个c字符 
h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 
i) s.~string() //销毁所有字符,释放内存 
都很简单,我就不解释了。 

2.字符串操作函数 
这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。 
a) =,assign() //赋以新值 
b) swap() //交换两个字符串的内容 
c) +=,append(),push_back() //在尾部添加字符 
d) insert() //插入字符 
e) erase() //删除字符 
f) clear() //删除全部字符 
g) replace() //替换字符 
h) + //串联字符串 
i) ==,!=,<,<=,>,>=,compare() //比较字符串 
j) size(),length() //返回字符数量 
k) max_size() //返回字符的可能最大个数 
l) empty() //判断字符串是否为空 
m) capacity() //返回重新分配之前的字符容量 
n) reserve() //保留一定量内存以容纳一定数量的字符 
o) [ ], at() //存取单一字符 
p) >>,getline() //从stream读取某值 
q) << //将谋值写入stream 
r) copy() //将某值赋值为一个C_string 
s) c_str() //将内容以C_string返回 
t) data() //将内容以字符数组形式返回 
u) substr() //返回某个子字符串 
v)查找函数 
w)begin() end() //提供类似STL的迭代器支持 
x) rbegin() rend() //逆向迭代器 
y) get_allocator() //返回配置器 
下面详细介绍: 

2.1 C++字符串和C字符串的转换 
C 
++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’\0’。c_str()返回一个以‘\0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string或 
字符数组内。C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。由于只是简单介绍,详细介绍掠过,谁想进一步了解使用中的注意事项可以给我留言(到我的收件箱)。我详细解释。 


2.2 大小和容量函数 
一个C++字符 串存在三种大小:a)现有的字符数,函数是size()和length(),他们等效。Empty()用来检查字符串是否为空。b)max_size() 
这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他,应该大小足够我们用的。但是不够用的话,会抛出length_error异常c)capacity()重新分配内存之前 
string所能包含的最大字符数。这里另一个需要指出的是reserve()函数,这个函数为string重新分配内存。重新分配的大小由其参数决定, 
默认参数为0,这时候会对string进行非强制性缩减。 

还有必要再重复一下C++字符串和C字符串转换的问 
题,许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数Connect(char*,char*)),但别人的函数参 
数用的是char*形式的,而我们知道,c_str()、data()返回的字符数组由该字符串拥有,所以是一种const 
char*,要想作为上面提及的函数的参数,还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。那么,这时候我们的处理方式是:如果 
此函数对参数(也就是char*)的内容不修改的话,我们可以这样Connect((char*)UserID.c_str(), 
(char*)PassWD.c_str()),但是这时候是存在危险的,因为这样转换后的字符串其实是可以修改的(有兴趣地可以自己试一试),所以我强调除非函数调用的时候不对参数进行修改,否则必须拷贝到一个char*上去。当然,更稳妥的办法是无论什么情况都拷贝到一个char*上去。同时我们也祈 
祷现在仍然使用C字符串进行编程的高手们(说他们是高手一点儿也不为过,也许在我们还穿开裆裤的时候他们就开始编程了,哈哈…)写的函数都比较规范,那样 
我们就不必进行强制转换了。 
2.3元素存取 

我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。而at()会检查,如果使用 
at()的时候索引无效,会抛出out_of_range异常。 
有一个例外不得不说,const string 
a;的操作符[]对索引值是a.length()仍然有效,其返回值是’\0’。其他的各种情况,a.length()索引都是无效的。举例如下: 
const string Cstr("const string"); 
string Str("string"); 

Str[3]; //ok 
Str.at(3); //ok 

Str[100]; //未定义的行为 
Str.at(100); //throw out_of_range 

Str[Str.length()] //未定义行为 
Cstr[Cstr.length()] //返回 ‘\0’ 
Str.at(Str.length());//throw out_of_range 
Cstr.at(Cstr.length()) ////throw out_of_range 

我不赞成类似于下面的引用或指针赋值: 
char& r=s[2]; 
char* p= &s[3]; 
因为一旦发生重新分配,r,p立即失效。避免的方法就是不使用。 

2.4比较函数 
C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 
str<"hello")。在使用>,>=,<,<=这些操作符的时候是根据"当前字符特性"将字符按字典顺序进行逐一得 
比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string 
("aaaa") <string(aaaaa)。 
另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等 
〉0-大于 <0-小于。举例如下: 
string s("abcd"); 

s.compare("abcd"); //返回0 
s.compare("dcba"); //返回一个小于0的值 
s.compare("ab"); //返回大于0的值 

s.compare(s); //相等 
s.compare(0,2,s,2,2); //用"ab"和"cd"进行比较 小于零 
s.compare(1,2,"bcx",2); //用"bc"和"bc"比较。 
怎么样?功能够全的吧!什么?还不能满足你的胃口?好吧,那等着,后面有更个性化的比较算法。先给个提示,使用的是STL的比较算法。什么?对STL一窍不通?靠,你重修吧! 


2.5 更改内容 
这在字符串的操作中占了很大一部分。 

首先讲赋值,第一个赋值方法当然是使用操作符=,新值可以是string(如:s=ns) 
、c_string(如:s="gaint")甚至单一字符(如:s=’j’)。还可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。还是举例说明吧: 

s.assign(str); //不说 
s.assign(str,1,3);//如果str是"iamangel" 就是把"ama"赋给字符串 
s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s 
s.assign("gaint"); //不说 
s.assign("nico",5);//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串 
s.assign(5,’x’);//把五个x赋给字符串 
把字符串清空的方法有三个:s="";s.clear();s.erase();(我越来越觉得举例比说话让别人容易懂!)。 
string提供了很多函数用于插入(insert)、删除(erase)、替换(replace)、增加字符。 
先说增加字符(这里说的增加是在尾巴上),函数有 +=、append()、push_back()。举例如下: 
s+=str;//加个字符串 
s+="my name is jiayp";//加个C字符串 
s+=’a’;//加个字符 

s.append(str); 
s.append(str,1,3);//不解释了 同前面的函数参数assign的解释 
s.append(str,2,string::npos)//不解释了 

s.append("my name is jiayp"); 
s.append("nico",5); 
s.append(5,’x’); 

s.push_back(‘a’);//这个函数只能增加单个字符 对STL熟悉的理解起来很简单 

也许你需要在string中间的某个位置插入字符串,这时候你可以用insert()函数,这个函数需要你指定一个安插位置的索引,被插入的字符串将放在这个索引的后面。 

s.insert(0,"my name"); 
s.insert(1,str); 
这 种形式的insert()函数不支持传入单个字符,这时的单个字符必须写成字符串形式(让人恶心)。既然你觉得恶心,那就不得不继续读下面一段话:为了插 
入单个字符,insert()函数提供了两个对插入单个字符操作的重载函数:insert(size_type index,size_type num,chart 
c)和insert(iterator pos,size_type num,chart 
c)。其中size_type是无符号整数,iterator是char*,所以,你这么调用insert函数是不行的:insert(0,1, 
’j’);这时候第一个参数将转换成哪一个呢?所以你必须这么写:insert((string::size_type)0,1,’j’)!第二种形式指 
出了使用迭代器安插字符的形式,在后面会提及。顺便提一下,string有很多操作是使用STL的迭代器的,他也尽量做得和STL靠近。 
删除函数erase()的形式也有好几种(真烦!),替换函数replace()也有好几个。举例吧: 
string s="il8n"; 
s.replace(1,2,"nternationalizatio");//从索引1开始的2个替换成后面的C_string 
s.erase(13);//从索引13开始往后全删除 
s.erase(7,5);//从索引7开始往后删5个 

2.6提取子串和字符串连接 
题取子串的函数是:substr(),形式如下: 
s.substr();//返回s的全部内容 
s.substr(11);//从索引11往后的子串 
s.substr(5,6);//从索引5开始6个字符 
把两个字符串结合起来的函数是+。(谁不明白请致电120) 

2.7输入输出操作 
1.>> 从输入流读取一个string。 
2.<< 把一个string写入输出流。 
另一个函数就是getline(),他从输入流读取一行内容,直到遇到分行符或到了文件尾。 

2.8搜索与查找 
查找函数很多,功能也很强大,包括了: 
find() 
rfind() 
find_first_of() 
find_last_of() 
find_first_not_of() 
find_last_not_of() 
这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。所有的函数的参数说明如下: 
第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜寻的字符个数。比较简单,不多说不理解的可以向我提出,我再仔细的解答。当然,更加强大的STL搜寻在后面会有提及。 

最 
后再说说npos的含义,string::npos的类型是string::size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string::size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较(如:if(s.find("jia")== 
string::npos))。 

c++中的char[] ,char* ,string三种字符串变量转化的兼容原则 本文仅通过字符串的char[] ,char* ,string三种不同存储方式和转化方法来阐释变量之间转化时的兼容原则。 阅读详情

相关推荐

c++ String构造函数 析构函数等号重载

String 类的原型如下 class String {    public:           String(const char *str=NULL); //构造函数           String(const String &other); //拷贝构造函数           ~String(void); //析构函数           String& operat

zhanghaotian2011的专栏 2766

C++中string与char*相互转换

string与char*相互转换

neuzhangno的博客 1万+

c++ string 的常用库函数的用法

String的遍历。

usstmiracle的博客 1万+

【C++】C++中string和char*的相互转换

string和char*,作为C++中常用的数据类型,经常需要进行相互转换,故此总结转换方法。

shanhedian2013的博客 7529

三角洲行动交易行自动化脚本

DFMarketBot - 三角洲行动自动交易助手 DFMarketBot是一款专为三角洲行动游戏设计的交易行自动化工具,通过OCR识别和鼠标模拟实现自动补卡、补子弹功能。项目采用Python开发,支持Windows平台,主要功能包括: 自动检测并购买指定物品(房卡/子弹) 价格监控与智能购买(低于设定价格自动下单) 自定义购买数量与次数限制 支持窗口/无窗口两种游戏模式 使用前需安装Tesseract OCR引擎并配置游戏为1920*1080分辨率。通过JSON文件可灵活配置监控物品清单、理想价格和购买策

愤怒的阿木木的博客 3万+

ThingsBoard教程(十六):RPC部件的使用

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了十篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 ThingsBoard教程(七):模拟设备遥测 ThingsBoard教程(八):自定义UI T

知无涯 4579

c++ string类的构造函数

在c++中string类的构造函数有六种方式 分别是: 1.string(const char * s) 说明:将string对象初始化为s指向NBTS。NBTS为null-byte-temnated string的缩写,表示以空字符结束的字符串------传统的C字符串。 2.string(size_type n,char c) 说明:创建一个包含n个元素的string对象,其中每个元

学习这件事,不是缺乏时间,而是缺乏努力。 4万+

基于深度学习的树木种类识别

本文介绍了基于深度学习的树木种类识别技术。我们将通过深度学习模型和图像处理技术实现对树木的自动识别与分类。首先,我们将介绍深度学习的基本原理和相关算法。接着,我们将详细说明树木种类识别的数据准备、模型构建和训练过程。最后,我们将给出代码示例,帮助读者深入了解和实践该技术。

一键难忘的博客 2316

C++ String类的构造函数、拷贝构造函数的实现

构造函数、析构函数与赋值函数是每个类最基本的函数,在一些公司的面试中也会经常问到这方面的问题。每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不手动编写上述函数,C++编译器将自动为类A生成四个缺省的函数:    A(void);                    // 缺省的无参数构造函数    A(con

面目全非,胸有丘壑 | Json Lee 1万+

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3414

基于matlab不变矩的数字验证码识别系统

随着互联网技术的快速发展和应用,网络给人们提供了丰富的资源和极大的便利,但随之而来的是互联网系统的安全性问题,而验证码正是加强 Web 系统安全性的产物。全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,CAPTCHA)也是验证码的一个应用程序,可以区分用户是人类还是计算机智能单击对象。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 917

C++ string类的构造函数

string类的构造函数共6个: size_type-依赖于实现的整型 n_pos-字符串的最大长度 NBTS-(null-byte-terminated string)表示以空字符结束的字符串-传统的C-风格字符串 1>string(const char *s):    //将string对象初始化为C—风格字符串 例:string one("First constru

Java技术博文 1206

Spring AI Alibaba Agent开发实战:DeepResearch Agent调度系统

智能Agent调度系统通过专业化分工解决传统AI系统的三大痛点:通用模型专业性不足、处理效率低下和资源浪费。系统采用分层架构设计,核心组件包括智能调度器、Agent选择辅助器和集成工具类,实现问题分类、专业Agent匹配和搜索策略优化的全流程自动化。系统特点包括:1)配置驱动的灵活扩展;2)分层回退的容错机制;3)支持工具调用与传统搜索的智能切换。该架构通过策略模式和依赖注入等技术,在保证稳定性的同时显著提升了研究质量和效率,为企业级多Agent协作提供了完整解决方案。(149字)

wjianwei666的专栏 501

C++ String类构造函数

构造函数 描述 string(const char*) 将string对象初始化为s指向的NBTS(null-terminated string)即以空字符结束的传统C字符串 string(size_type n,char c) 创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c string(const string &str) 将一个string对象初始化为string对象str(复制构造函数) string() 创建一个默认的s

YourClerk的博客 1753

Win10 系统下VisualStudio2022 配置Open3D-0.18.0(C++)

Win10 系统下VisualStudio2022 配置Open3D-0.18.0

点云侠的博客 2655

【skill】漫剧 AI 视频创作的知识库 + API 调用手册

方案适用场景在对话中使用,自动触发注入到任何 LLM(Cursor/Windsurf/Claude API)Python 模块集成到自动化管线/批量生成GitHub 又限速了,不过前几轮搜到的已经够用了。根据搜索结果,结合已分析过的项目,给你整理完整对比 🐮。

突围 982

c++ string类构造函数

string 重载了+=运算符可以接受string ,c风格字符串,单个字符以上三种都是合法的,也就是说+=后面三中数据元素都可以接收同时=号上面三种数据元素也都合法。

s103424的博客 970

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++ string类7个构造函数大全(示例极易理解)

string类是C++用户必须了解的类,而自带的构造函数丰富多样,也可以帮助用户快速的初始化其字符串,并按照不同的参数格式调用相对应的构造函数

MH_cJJ的博客 3683

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c++中的string类的构造函数

string不属于stl的容器, string strs //生成空字符串 string s(str) //生成字符串str的复制品 string s(str, stridx) //将字符串str中始于stridx的部分作为构造函数的初值 string s(str, strbegin, strlen) //将字符串str中始于strbegin、长度为strlen的部分作为字符串初值 string...

woainilixuhao的博客 1121

OV9734 DATASHEET,完整规格书

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

C++ string类构造函数

C++笔试时常考的string类构造函数实现: class CString { public: CString (const char* str = NULL);//普通构造函数,默认str为NULL CString (const CString &other);//拷贝构造函数 ~CString();//析构函数 CString& operator =(const CStrin

cindywry的博客 1182

C++基础---string类的构造函数

1. string类的构造函数 1.1 default:string(); 原型: string(); 说明:默认构造函数,构造一个空字符串。 代码示例: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { string s1; cout&lt;&...

We_are_family678的博客 3256

【C++基础】构造函数、析构函数、string类

一、构造函数 1.首先我们知道一个常用的编码规范:声明变量赋初值。就是说我们在声明一个变量的时候,可以对它进行初始化,如果不对自己定义的变量进行初始化,一般编译器会指定一个随机值对它进行初始化,例如: int i = 0; int *p = NULL; mallo 申请到的内存区域使用memset进行设置。 说白了,初始化就是给变量让它处于一个特定的状态、 同理,成员函数在进行定义的时...

JoJoJo1234的博客 416

java string的构造函数_C++ string类的构造函数

string类的构造函数共6个:size_type-依赖于实现的整型n_pos-字符串的最大长度NBTS-(null-byte-terminated string)表示以空字符结束的字符串-传统的C-风格字符串1>string(const char *s): //将string对象初始化为C—风格字符串例:string one("First constructor!"); //one=...

weixin_34050521的博客 270

C++ string容器-40-string构造函数和赋值函数

接着学习C++中的string容器。字符串操作在任何编程语言都很常见,每个语言都提供了一些常见的API,例如字符串查找,替换,删除等。这篇来学习字符串的构造函数和赋值操作。 1.string的基本概念 string是C++风格的字符串,而string本质上是一个类。string和har * 区别:char *是一个指针,string是一个类,类内部封装了char *,管理这个字符串,是一个char *形的容器。 string类有这些特点,string类内部封装了很多成员方法,例如查找find, 拷贝co

Anthony_tester的博客 3104

C++ Primer:string构造函数总结

1. string的构造函数 string的构造函数 描述 string s 默认构造函数,元素个数为空 string s(n,‘a’) s是由n个’a’组成的字符串 string s{‘a’,‘b’,…} 将初始化列表拷贝到s string s(cp)string s(cp,n) 将cp指向的数组拷贝到s,数组必须以空字符结尾将从cp开始的n个字符拷贝到s st...

北冥有鱼wyh的博客 284

C++string构造函数和析构函数

构造函数有四个参数,其中三个具有默认值。要初始化一个 string 类,可以使用 C 风格字符串或 string 类型对象,也可以使用 C 风格字符串的部分或 string 类型对象的部分或序列。 注意,不能使用字符或者整数去初始化字符串。 常见的 string 类构造函数有以下几种形式: string strs //生成空字符串 string s(str) //生成字符串str的复制品 s...

snowcatvia的博客 1065
上一篇: ZOJ_1251_Box of Bricks
下一篇: ZOJ_1292_Integer Inquiry
wankaiming
博客等级 码龄15年 49粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值