C++ string 操作

本文详细介绍了C++中字符串的常见操作,包括大小写转换、字符串与整型间的转换、赋值、连接、比较、子串提取、交换、查找、替换、插入、删除以及迭代器处理。此外,还讲解了如何利用istringstream和ostringstream进行字符串流处理。
摘要由CSDN通过智能技术生成

目录

字符串大小写转换

string互转int

​​​​​​​特性描述

​​​​​​​赋值 =、assign

​​​​​​​连接 +=、append、push_back

​​​​​​​比较 compare

​​​​​​​子串 substr

​​​​​​​交换 swap

​​​​​​​查找 find/rfind...

​​​​​​​替换 replace

​​​​​​​插入 insert

​​​​​​​删除 erase、pop_back

​​​​​​​迭代器处理 const_iterator


​​​​​​​

​​​​​​​字符串大小写转换

//将字符串s转化为小写字母

transform(s.begin(), s.end(), s.begin(), ::tolower);

//将字符串s转化为大写字母

transform(s.begin(), s.end(), s.begin(), ::toupper);

    1. string转C串

string str="hello world!";

    char * ch=new char[str.size()+1];

strcpy(ch,str.c_str());

  1. string互转int

    1. string to int

a.采用标准库中atoi函数。(#include <stdlib.h>)

string s = "12";

int a = atoi(s.c_str());

对于其他类型也都有相应的标准库函数,比如浮点型atof(),long型atol()等等。

b.标准库stoi函数

  int stoi(const string & str)//将串按十进制转换为int

  还有double型stod,float型stof,long long型stoll等。

c.采用sstream头文件中定义的字符串流对象来实现转换。

istringstream is("12"); //构造输入字符串流,流的内容初始化为“12”的字符串

int i;

is >> i; //从is流中读入一个int整数存入i中

      1. int to string

a.采用标准库中的to_string函数。

int i = 12;

cout << std::to_string(i) << endl;

不需要包含任何头文件,应该是在utility中,但无需包含,直接使用,还定义任何其他内置类型转为string的重载函数,很方便。

b.采用sstream中定义的字符串流对象来实现。

ostringstream os; //构造一个输出字符串流,流内容为空

int i = 12;

os << i; //向输出字符串流中输出int整数i的内容

cout << os.str() << endl; //利用字符串流的str函数获取流中的内容

字符串流对象的str函数对于istringstream和ostringstream都适用,都可以获取流中的内容。

​​​​​​​特性描述

int capacity()const;    //返回当前容量(即string中不必增加内存即可存放的元素个数)

int max_size()const;    //返回string对象中可存放的最大字符串的长度

int size()const;        //返回当前字符串的大小

int length()const;       //返回当前字符串的长度

bool empty()const;        //当前字符串是否为空

void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分

​​​​​​​赋值 =、assign

string &operator=(const string &s);//把字符串s赋给当前字符串

string &assign(const char *s);//用c类型字符串s赋值

string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值

string &assign(const string &s);//把字符串s赋给当前字符串

string &assign(int n,char c);//用n个字符c赋值给当前字符串

string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串

string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串

​​​​​​​连接 +=、append、push_back

string &operator+=(const string &s);//把字符串s连接到当前字符串的结尾

string &append(const char *s);            //把c类型字符串s连接到当前字符串结尾

string &append(const char *s,int n);//把c类型字符串s的前n个字符连接到当前字符串结尾

string &append(const string &s);    //同operator+=()

string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾

string &append(int n,char c);        //在当前字符串结尾添加n个字符c

string &append(const_iterator first,const_iterator last);//把迭代器first和last之间的部分连接到当前字符串的结尾

​​​​​​​比较 compare

bool operator==(const string &s1,const string &s2)const;//比较两个字符串是否相等

运算符">","<",">=","<=","!="均被重载用于字符串的比较;
int compare(const string &s) const;//比较当前字符串和s的大小

int compare(int pos, int n,const string &s)const;//比较当前字符串从pos开始的n个字符组成的字符串与s的大小

int compare(int pos, int n,const string &s,int pos2,int n2)const;//比较当前字符串从pos开始n个字符字符串与s中pos2开始n2个字符字符串的大小

int compare(const char *s) const;

int compare(int pos, int n,const char *s) const;

int compare(int pos, int n,const char *s, int pos2) const;

compare函数在>时返回1,<时返回-1,==时返回0

​​​​​​​子串 substr

string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串

使用匿名构造函数返回子串:

string (iterator start,iterator end) //返回[start,end);

string (&s[i],&s[j]) //返回 [i,j);

​​​​​​​交换 swap

void swap(string &s2);    //交换当前字符串与s2的值

​​​​​​​查找 find/rfind...

int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置

int find(const char *s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置

int find(const char *s, int pos, int n) const;//从pos开始查找字符串s中前n个字符在当前串中的位置

int find(const string &s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置

//查找成功时返回所在位置,失败返回string::npos的值

 

int rfind(char c, int pos = npos) const;//从pos开始从后向前查找字符c在当前串中的位置

int rfind(const char *s, int pos = npos) const;

int rfind(const char *s, int pos, int n = npos) const;

int rfind(const string &s,int pos = npos) const;

//从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值

 

int find_first_of(char c, int pos = 0) const;//从pos开始查找字符c第一次出现的位置

int find_first_of(const char *s, int pos = 0) const;

int find_first_of(const char *s, int pos, int n) const;

int find_first_of(const string &s,int pos = 0) const;

//从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。查找失败返回string::npos

 

int find_first_not_of(char c, int pos = 0) const;

int find_first_not_of(const char *s, int pos = 0) const;

int find_first_not_of(const char *s, int pos,int n) const;

int find_first_not_of(const string &s,int pos = 0) const;

//从当前串中查找第一个不在串s中的字符出现的位置,失败返回string::npos

 

int find_last_of(char c, int pos = npos) const;

int find_last_of(const char *s, int pos = npos) const;

int find_last_of(const char *s, int pos, int n = npos) const;

int find_last_of(const string &s,int pos = npos) const;

int find_last_not_of(char c, int pos = npos) const;

int find_last_not_of(const char *s, int pos = npos) const;

int find_last_not_of(const char *s, int pos,  int n) const;

int find_last_not_of(const string &s,int pos = npos) const;

//find_last_of和find_last_not_of与find_first_of和find_first_not_of相似,只不过是从后向前查找

​​​​​​​替换 replace

string &replace(int p0, int n0,const char *s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,const char *s, int n);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符

string &replace(int p0, int n0,const string &s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,const string &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符

string &replace(int p0, int n0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c

string &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串s

string &replace(iterator first0, iterator last0,const char *s, int n);//把[first0,last0)之间的部分替换为s的前n个字符

string &replace(iterator first0, iterator last0,const string &s);//把[first0,last0)之间的部分替换为串s

string &replace(iterator first0, iterator last0,int n, char c);//把[first0,last0)之间的部分替换为n个字符c

string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之间的部分替换成[first,last)之间的字符串

​​​​​​​插入 insert

string &insert(int p0, const char *s);

string &insert(int p0, const char *s, int n);

string &insert(int p0,const string &s);

string &insert(int p0,const string &s, int pos, int n);

//前4个函数在p0位置插入字符串s中pos开始的前n个字符

 

string &insert(int p0, int n, char c);//此函数在p0处插入n个字符c

iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置

void insert(iterator it, const_iterator first, const_iterator last);//在it处插入[first,last)之间的字符

void insert(iterator it, int n, char c);//在it处插入n个字符c

​​​​​​​删除 erase、pop_back

iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置

iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置

string &erase(int pos = 0, int n = npos);//删除pos开始的n个字符,返回修改后的字符串

s.pop_back()  //删除末尾一个字符

​​​​​​​迭代器处理 const_iterator

string类提供了向前和向后遍历的迭代器iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。
用string::iterator或string::const_iterator声明迭代器变量,const_iterator不允许改变迭代的内容。常用迭代器函数有:

  1. const_iterator begin()const;
  2. iterator begin();                //返回string的起始位置
  3. const_iterator end()const;
  4. iterator end();               //返回string的最后一个字符后面的位置
  5. const_iterator rbegin()const;
  6. iterator rbegin();               //返回string的最后一个字符的位置
  7. const_iterator rend()const;
  8. iterator rend();                  //返回string第一个字符位置的前面

rbegin和rend用于从后向前的迭代访问,通过设置迭代器string::reverse_iterator,string::const_reverse_iterator实现

【"字符串流处理"】:
通过定义ostringstream和istringstream变量实现,<sstream>头文件中
例如:

  string input("hello,this is a test");

    istringstream is(input);

    string s1,s2,s3,s4;

    is>>s1>>s2>>s3>>s4;//s1="hello,this",s2="is",s3="a",s4="test"

    ostringstream os;

    os<<s1<<s2<<s3<<s4;

    cout<<os.str();

对于string 对象进行的操作非常多,在这里调用的成员函数中也包括由点操作符和函数名组成的对象名称,同时对象通过函数的参数列表来传递。如下所示:

#include <iostream>

#include <string>

using namespace std;

int main()

{

  string s1="string of many words.",s2="many"; //s1="string of many words.和"s1("string of many words.")等价。都调用了string类构造函数。

  int i;

  cout<<s1<<endl;

  i=s1.find(s2); //调用find函数,返回s2在s1中的位置。在这里返回10,因s1在s2起始位置是10

  s1.replace(i,4,"few");//调用replace函数用字符串few来替换s1中的4个字符。i的值就是find的返回值,

//many在字符串中的位置,并且表示替换从这该位置开始。

  cout<<s1<<endl;

  s1.erase(i,4);   //删除了s1字符串中从第10个开始的4个字符

  cout<<s1<<endl;

  s1.insert(i,"simple ");  //把字符串"simple"插入字符串s1的第10个字符的位置。

  cout<<s1<<endl;

 }


在调用find函数时,没有找到字符串s2将返回一个string类的数据成员npos(npos=-1),在string类中find函数被重载了,
重载后有两个参数ob1.find(ob2,index),index 是个整数值,表示从字符串ob1中开始搜索起始位置。

repace函数也可以重载,如ob1.replace(index1,num1,ob2,index2,num2);这里index1和num1是ob1中要替换的字符串和字符个数,
index2和num2是ob2中用于替换字符串下标和字符个数,replace函数返回一个引用给调用对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值