C++字符串string详解

本文详细介绍了C++中string类的功能,包括赋值、输入输出、大小容量管理、元素访问、迭代器、插入与删除、比较、查找与替换、子串提取、连接以及常用工具如getline和流转换。掌握这些操作有助于高效地处理字符串任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++字符串String

简介:

string类是C++中用来操作字符串序列的、可以自身管理内存的容器,自身携带的构造函数和析构函数。

它支持元素的存取访问、字符串比较、字符串内容的修改和替换、字符串连接、字符串的查找和搜索、字符串的IO操作、可以方便的获取器大小和容量等等。

头文件:

为了在我们的程序中使用string类型,我们必须包含头文件 。如下:

#include //注意这里不是string.h string.h是C字符串头文件

功能函数:

赋值:
  • =

  • assign() //赋以新值,新值可以是string(如:s=ns)、c_string(如:s=”gaint”)甚至单一字符(如:s=’j’)

    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赋给字符串
    
输入输出:
  • getline(),>> //从stream读取某值

  • << //将谋值写入stream

  • getline(),它从输入流读取一行内容,直到遇到分行符或到了文件尾。

大小和容量
  • size(),length() //返回字符数量

  • max_size() //返回字符的可能最大个数

  • empty() //判断字符串是否为空

  • capacity() //返回重新分配之前的字符容量

  • reserve() //保留一定量内存以容纳一定数量的字符

元素存取:
  • [ ]
  • at() / /存取单一字符
str[i]   str.at(i)
  • 我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。而at()会检查,如果使用at()的时候索引无效,会抛出out_of_range异常。

  • 有一个例外不得不说,const stringa;的操作符[]对索引值是a.length()仍然有效,其返回值是’\0’。其他的各种情况,a.length()索引都是无效的。

迭代器:
  • begin();//提供类似STL的迭代器支持
  • end() ;
  • rbegin() ;//逆向迭代器
  • rend() ;
插入:

insert():这个函数需要你指定一个安插位置的索引,被插入的字符串将放在这个索引的后面。

 s.insert(0,”my name”);
 s.insert(1,str); 
 s.insert(1,str,2);从1位置插入str的前2个字符

不支持插入字符类型的单个字符

尾部增加字符:
    - s1=s1+s2;//加字符串
    - s1=s1+"Hello";//加C字符串
    - s=s+'a';//加字符
    
  • append()

    s.append(str);
    s.append(str,1,3);
    s.append(str,2,string::npos);
    s.append(“my name is jiayp”);
    s.append(“nico”,5);
    s.append(5,’x’);
    
  • push_back()

    s.push_back(‘a’);//这个函数只能增加单个字符
    
删除:

s.erase(13);//从索引13开始往后全删除

s.erase(7,5);//从索引7开始往后删5个

替换:

s.replace();

s.replace(1,2,”nternationalizatio”);//删除从索引1开始的2个字符,然后从1后开始替换成后面的string

s.replace(1,3,str,2,4);//从1开始用str种[2,4]的字符替换

s.replace(1,4,4,'X');// //用4个X替换 【1,4】的字符

s.replace(ste.begin(),ste.end());//使用迭代器
提取子串:

substr():

s.substr();//返回s的全部内容
s.substr(11);//从索引11往后的子串
s.substr(5,6);//从索引5开始6个字符
连接:

“+”

比较:
  • 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的值  
    
查找:

find():

s.find(s1,n,m);

这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。所有的函数的参数说明如下:第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜寻的字符个数。

们可以直接把函数和npos进行比较(如:if(s.find(“jia”)==string::npos))。也可以看作返回的是-1。

string strFind = “ISMILE”
string str = "hello,I'm ISMILELI,Thank you for paying attention to me! "
str.find(strFind,0); // 正向查找
str.find(strFind,3); // 从下标位置3开始正向查找
str.rfind(strFind,0); // 反向查找
str.rfind(strFind,3); // 从下标位置3开始反向查找
str.find_first_of(strFind); // 查找第一个是strFind的子串
str.find_first_of(‘I’); // 查找第一个是I的字符
str.find_first_not_of(strFind); // 查找第一个不是strFind的子串
str.find_first_not_of(‘I’); // 查找第一个不是I的字符
str.find_last_of(strFind); // 查找最后一个是strFind的子串
str.find_last_of(‘I’); // 查找最后一个是I的字符
str.find_last_not_of(strFind); // 查找最后一个不是strFind的子串
str.find_last_not_of(‘I’); // 查找最后一个不是I的字符
交换:

swap(); //交换两个字符串的内容

清空:
  • s="";
  • s.clear();
  • s.erase();

其他:

读入整行字符串的函数getline():

大家百度会发现getline()的原型是 istream& getline ( istream &is , string &str , char delim );

其中 istream &is 表示一个输入流,譬如cin;string&str表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入)。

getline(cin,str,'#'); cin给str,遇到#停止
字符串和整形的转换:

头文件 定义了三个istringstreamostringstreamstringstream,分别用来进行流的输入、输出和输入输出操作。本文以 stringstream 为主,介绍流的输入和输出操作。

主要用于整形和字符串型的转换
字符串->整形
string str;
stringstream ss;
ss<<str;
int a;
ss>>a;
整形->字符串
int a=10000;
string str;
stringstream ss;
ss<<a;
ss>>str;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值