C++字符串操作详解

【C++基础】字符串的基本操作 本文讲解了字符串的基本操作及函数的使用方法,如字符串的插入、删除、替换、拼接及查找是否包含等,希望各位对字符串有了更深的了解。 阅读详情

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

首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下: 
#include string//注意这里不是string.h string.h是C字符串头文件 
1.定义和构造初始化(参考百科,自己动手体会用法) 
声明一个字符串变量很简单: 
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() //销毁所有字符,释放内存 
测试如下:

# include <iostream>
# include <string>
using namespace std;
int main()
{
    string str1 = "yesterday once more";
    string str2 ("my heart go on");
    string str3 (str1,6); // = day once more
    string str4 (str1,6,3); // = day

    char ch_music[] = {"Roly-Poly"};

    string str5 = ch_music; // = Roly-Poly 
    string str6 (ch_music); // = Roly-Poly
    string str7 (ch_music,4); // = Roly
    string str8 (10,'i'); // = iiiiiiii
    string str9 (ch_music+5, ch_music+9); // = Poly

    str9.~string();

    //cout<<str9<<endl; // 测试输出

    getchar();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

2.字符串操作函数 
这里是C++字符串的重点 
1) =,assign() //赋以新值 
“=”的用法不作详细说明,assign用法如下:

# include <iostream>
# include <string>
using namespace std;
int main()
{
    string str1 = "yesterday once more";
    string str2 ("my heart go on");
    string str3,str4;

    str3.assign(str2,3,6);  // = heart
    str4.assign(str2,3,string::npos); // = heart go on (从2开始到结尾赋给str4)
    str4.assign("gaint"); // =gaint
    str4.assign("nico",5); // = nico,超出长度会发生什么。。。
    str4.assign(5,'x'); // = xxxxx
    cout<<str4<<endl;

    getchar();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2) swap() //交换两个字符串的内容 
用法如下:

# include <iostream>
# include <string>
using namespace std;
int main()
{
    string str1 = "yesterday once more";
    string str2 ("my heart go on");

    str2.swap(str1);
    cout<<str1<<endl; // = my heart go on
    cout<<str2<<endl; // = yesterday once more

    getchar();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3) +=,append(),push_back() *//在尾部添加字符* 
增加字符(这里说的增加是在尾巴上),函数有 +=、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’);//这个函数只能增加单个字符

4) insert() //插入字符** 
在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靠近。 
5) erase() //删除字符**

s.erase(13);//从索引13开始往后全删除 
s.erase(7,5);//从索引7开始往后删5个 
6) clear() //删除全部字符** 
用法不作说明; 
7) replace() //替换字符** 
string s=”il8n”; 
s.replace(1,2,”nternationalizatio”);//从索引1开始的2个替换成后面的 
C_string s = internationalization 
8) + //串联字符串** 
9) ==,!=,<,<=,>,>=,compare() //比较字符串 
C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),甚至支持string与C-string的比较(如 str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。 
另一个功能强大的比较函数是成员函数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”比较。 
10) size(),length() //返回字符数量 
现有的字符数,函数是size()和length(),他们等效。 
11) max_size() //返回字符的可能最大个数??? 
max_size() 这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他,应该大小足够我们用的。但是不够用的话,会抛出length_error异常 
12) empty() //判断字符串是否为空 
Empty()用来检查字符串是否为空。 
13) capacity() //返回重新分配之前的字符容量 
capacity()重新分配内存之前 string所能包含的最大字符数。 
14) reserve() //保留一定量内存以容纳一定数量的字符 
这个函数为string重新分配内存。重新分配的大小由其参数决定,默认参数为0,这时候会对string进行非强制性缩减。 
15) [ ], at() //存取单一字符 
可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。而at()会检查,如果使用 at()的时候索引无效,会抛出out_of_range异常。

   string str1 = "Iphone 5";
   cout<<str1[2]<<endl; // = h
   cout<<str1.at(4)<<endl; // = n

    string stuff;
    getline(cin,stuff); // 输入一行字符赋值给stuff
    getline(cin,stuff,'!'); // 输入一行字符以“!”结束
    cout<<stuff<<endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

16) >>,getline() //从stream读取某值 
17) << //将谋值写入stream 
18) copy() //将某值赋值为一个C_string 
c_str() //将内容以C_string返回 
data() //将内容以字符数组形式返回 
C ++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’\0’。c_str()返回一个以‘\0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string或字符数组内。C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。 
19) substr() //返回某个子字符串 
substr(),形式如下: 
s.substr();//返回s的全部内容 
s.substr(11);//从索引11往后的子串 
s.substr(5,6);//从索引5开始6个字符 
20)查找函数 
查找函数很多,功能也很强大,包括了: 
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))。

# include <iostream>
# include <string>

using namespace std;
int main()
{
    string str = "when i was young, i listen to radio.";
    string::size_type position;

    position  = str.find("listen");

    if (position != str.npos) //npos是个很大的数,如果没找到就会返回npos的值给position
    {
        cout<<"第一次出现的下标是:"<<position<<endl;
    }

    //从字符串下标9开始,查找字符串you,返回you 在str中的下标
    position = str.find("you",9);
    cout<<"str.find("you",9")is:"<<position<<endl;

    //查找子串出现的所有位置
    string substr = "i";
    position = 0;
    int i = 1;
    while((position = str.find_first_of(substr,position)) != string::npos)
    {
        cout<<"position "<<i++<<position<<endl;
        position++;
    }

    //反向查找子串在str中最后出现的位置
    string flag = "to";
    position = str.rfind(flag);
    cout<<"str.rfind(flag):"<<position<<endl;
    getchar();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

21)begin() end() //提供类似STL的迭代器支持

# include <iostream>
# include <string>
# include <algorithm>
using namespace std;
int main()
{
    string str;

    str.push_back('Q');
    str.push_back('A');

    sort(str.begin(),str.end());
    string::iterator itstr = str.begin();

    for ( ; itstr != str.end(); itstr++)
    {
        cout<<*itstr;
    }   

    //str.pop_back();

    getchar();
    return 0;   //输出AQ
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

22) rbegin() rend() //逆向迭代器 
23) get_allocator() //返回配置器


原文http://blog.youkuaiyun.com/fenxinzi557/article/details/51457829

C++字符串拼接效率比较(+=、append、stringstream、spintf) 事情起因很简单,自己的代码中使用了stringstream对象进行字符串的拼接,然后被老同事质疑效率低下。借着这个机会了解下为什么? 一、+=、append、stringsteam、sprintf四种字符串拼接方法比较 C/C++中字符串拼接的使用场景非常多,字符串拼接的方法也非常多,这里简单的比对下上述四种方法的效率。 测试方法:分别哟经+=、append、stringstream、sprintf的方式来拼接字符串。s1=“aaaaa”,s2=“bbbbb”,s3=“ccccc”。内层循环将这三个字 阅读详情

相关推荐

C/C++字符串操作的全面总结,值得收藏!

字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃。本文总结了一些构建string对象方法、修改string对象的方法、string类型的操作函数、string类型的查找、string对象的比较。 1 构建string对象方法 首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下: #include 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参

我不是码农的博客~~~ 1385

C++ 字符串

C++ 字符串 C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包..

cnds123的专栏 2万+

4、C++ 字符串与简单输入操作详解

本文详细讲解了C++中的字符串输出和简单输入操作,包括字符串格式控制、特殊字符的使用、变量初始化的重要性以及输入流的错误处理机制。通过示例代码和流程图,帮助开发者更好地掌握C++输入输出操作,编写健壮可靠的程序。

w7x8y9z的博客 60

【C++】字符串详解

字符串简介: 字符串是存储在内存中连续字节的一系列字符。C++中处理字符串有两种风格,一种来自C语言,叫做C语言风格;另一种风格基于string库,我们姑且叫string库风格。其中C语言风格,利用了字符串储存在内存中连续字节的特点,将字符串储存在字符数组中,以‘\0’结尾;而string库风格提供的方法,允许程序员将字符串作为变量来使用,接下来将分别介绍这两种风格。 1.C语言风格 (1)字符串...

Darknight::的博客 1万+

94、C++基础字符串操作详解

本文详细介绍了C++中basic_string的基础字符串操作,包括构造、赋值、迭代器支持、容量管理、元素访问、修改操作、字符串比较以及起始和结束检查等内容。通过代码示例和流程图解析,帮助开发者深入理解并高效使用字符串处理功能。

rr23456的博客 148

19、C++ 模板、字符串、向量及流操作知识详解

本文详细讲解了C++编程语言中的模板、字符串、向量以及流和文件操作的相关知识。内容涵盖字符串的拼接、赋值、插入、替换、删除等常见操作,向量的声明、构造、访问和常用操作,以及一个基于向量和字符串的神秘商店游戏示例。同时深入介绍了流和文件操作中的基本概念、流操纵器、二进制与文本文件的区别、位运算和加密程序的实现,帮助读者全面掌握C++标准库中的核心内容。

p1q2r的博客 76

C++ 字符串操作详解

C++ 字符串入门全解

C++ 2287

VMware 安装 Windows11

一、下载win11的镜像文件 可以在MSDN网站下载: MSDN系统库-致力于原版windows生态服务 二、创建虚拟机 1.双击打开VMware虚拟机,点击创建新的虚拟机 2.选择典型(推荐),然后点击下一步 3.在安装程序光盘映像文件下,点击浏览按钮,选择Windows 11ISO镜像文件所在的路径,在Windows 11安装文件路径中不要有中文或其他特殊符号,否则有可能引起错误。然后点击下一步 4.在选择客户机操作系统界...

m0_56015193的博客 7013

​C++ 字符串常用操作详解

字符串处理是编程中最基础也最重要的技能之一。C++ 的提供了丰富的字符串操作方法,比 C 风格的字符数组更安全、更高效。下面我将详细介绍字符串的拼接、查找、截取等常用操作,并提供实用代码示例。

weixin_42838749的博客 1780

九齐NY8A051F低功耗模式全解析:从待机到休眠的省电实战

本文全面解析台湾九齐NY8A051F MCU的低功耗模式,从待机到休眠的省电实战技巧。通过实测数据展示四种工作模式的电流消耗差异,提供模式切换的标准流程和唤醒时序优化策略,并分享外围电路省电设计和低电压检测的实战应用,帮助开发者实现物联网设备的超长续航。

weixin_30839881的博客 407

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置)

本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。

weixin_29054399的博客 608

C++字符串操作函数大汇总与实例详解

C++提供了丰富的字符串操作函数,无论是C风格字符串函数还是C++标准库string类的成员函数,都能满足各种字符串处理需求。在实际编程中,应根据具体情况选择合适的函数,并注意函数的参数和返回值,以确保程序的正确性和高效性。C++提供了丰富的字符串操作函数,涵盖了C风格字符串函数以及C++标准库中string类的成员函数。C++标准库中的string类提供了更丰富、更安全的字符串操作函数,这些函数封装在<string>头文件中。string类提供了多个find函数,用于在字符串中查找子字符串或字符。

wengang345的博客 1151

Ubuntu18.04下Carla安装——经验史

Ubuntu下的Carla安装

m0_51267207的博客 2677

C++基础学习之String字符串操作详解

C++基础之string中函数操作详解

qq_45812934的博客 3167

别只聊天了!手把手教你为Ollama+Open WebUI搭建本地知识库(基于BGE-M3和Qwen)

本文详细介绍了如何利用Ollama、Open WebUI和BGE-M3构建本地知识库,实现智能问答和文档检索。通过环境准备、文档处理、向量化实战和应用案例,帮助用户突破基础聊天场景,打造高效的个人知识管理体系。特别适合技术文档管理和学术研究场景。

weixin_42523720的博客 478

【晶振专题】晶振学习笔记——ST AN2867应用手册 2

通过学习AN2867设计指南,我们知道皮尔斯晶振的基本知识。也了解了晶振的负载电容计算方法、安全因子测试方法和反馈电阻的作用。

一点硬件 1364

C++字符串string类常用操作详解(一)【初始化、遍历、连接】

#include <iostream> #include "string" using namespace std; //字符串初始化 void strInit() { cout << "字符串初始化:" <<endl; string s1 = "abcdefg"; //初始化方式1 string s2("abcdefg"); //初始化方...

weixin_42528089的博客 252

【深度学习基础】多任务学习(Multi-Task Learning)

多任务学习(Multi-task learning)是和单任务学习(single-task learning)相对的一种机器学习方法。在机器学习领域,标准的算法理论是一次学习一个任务,也就是系统的输出为实数的情况。复杂的学习问题先被分解成理论上独立的子问题,然后分别对每个子问题进行学习,最后通过对子问题学习结果的组合建立复杂问题的数学模型。多任务学习是一种联合学习,多个任务并行学习,结果相互影响。一次只学习一个任务(task),大部分的机器学习任务都属于单任务学习。

十二月的猫 1万+
上一篇: enum
下一篇: pycharm常用快捷操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值