C++ string字符串修改和替换方法详解

2023-11-07

字符串内容的变化包括修改和替换两种。本节将分别讲解字符串内容的修改和字符串内容的替换。
字符串内容的修改
可以通过使用多个函数修改字符串的值。例如 assign(),operator=,erase(),交换(swap),插入(insert)等。另外,还可通过 append() 函数添加字符。

下面逐一介绍各成员函数的使用方法。
assign()函数
使用 assign() 函数可以直接给字符串赋值。该函数既可以将整个字符串赋值给新串,也可以将字符串的子串赋值给新串。其在 basic_string 中的原型为:

basic_string& assign (const E*s); //直接使用字符串赋值
basic_string& assign (const E*s, size_type n);
basic_string& assign (const basic_string & str, size_type pos, size_type n);
//将str的子串赋值给调用串
basic_string& assign (const basic_string& str);    //使用字符串的“引用”賦值
basic_string& assign (size_type n, E c) ; //使用 n个重复字符賦值
basic_string& assign (const_iterator first, const_iterator last);    //使用迭代器赋值

以上几种方法在例 1 中均有所体现。请读者参考下述代码。

【例 1】

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1 ("123456");
    string str;
    str.assign (str1); //直接赋值
    cout << str << endl;
    str.assign (str1, 3, 3); //赋值给子串
    cout << str << endl;
    str.assign (str1,2,str1.npos);//赋值给从位置 2 至末尾的子串
    cout << str << endl;
    str.assign (5,'X'); //重复 5 个'X'字符
    cout << str << endl;
    string::iterator itB;
    string::iterator itE;
    itB = str1.begin ();
    itE = str1.end();
    str.assign (itB, (--itE)); //从第 1 个至倒数第 2 个元素,赋值给字符串 str
    cout << str << endl;
    return 0;
}

operator= 函数
operator= 的功能就是赋值。
erase()函数
erase() 函数的原型为:

    iterator erase (iterator first, iterator last);
    iterator erase (iterator it);
    basic_string& erase (size_type p0 = 0, size_type n = npos);

erase() 函数的使用方法为:

str.erase (str* begin(), str.end());
    或 str.erase (3);

swap()函数
swap()函数的原型为:

void swap (basic_string& str);

swap()函数的使用方法为:

string str2 ("abcdefghijklmn");
str.swap (str2);

insert()函数
insert () 函数的原型为:

basic_string& insert (size_type p0 , const E * s); //插人 1 个字符至字符串 s 前面
basic_string& insert (size_type p0 , const E * s, size_type n); // 将 s 的前 3 个字符插入p0 位置
basic_string& insert (size_type p0, const basic_string& str);
basic_string& insert (size_type p0, const basic_string& str,size_type pos, size_type n); //选取 str 的子串
basic_string& insert (size_type p0, size_type n, E c); //在下标 p0 位置插入  n 个字符 c
iterator insert (iterator it, E c); //在 it 位置插入字符 c
void insert (iterator it, const_iterator first, const_iterator last); //在字符串前插入字符
void insert (iterator it, size_type n, E c) ; //在 it 位置重复插入 n 个字符 c

insert() 函数的使用方法为:

 string A("ello");
    string B ;
    B.insert(1,A);
    cout << B << endl;
    A = "ello";
    B = "H";
    B.insert (1,"yanchy ",3);
    cout<< B <<endl;
    A = "ello";
    B = "H";
    B.insert (1,A,2,2);
    cout << B << endl;
    A="ello";
    B.insert (1 , 5 , 'C');
    cout << B << endl;
    A = "ello";
    string::iterator it = B.begin () +1;
    const string:: iterator itF = A.begin();
    const string:: iterator itG = A.end();
    B.insert(it,itF,itG);
    cout << B << endl;

append 函数
append() 函数的原型为:

 basic_string& append (const E * s); //在原始字符串后面追加字符串s
    basic_string& append (const E * s, size_type n);//在原始字符串后面追加字符串 s 的前 n 个字符
    basic_string& append (const basic_string& str, size_type pos,size_type n);//在原始字符串后面追加字符串 s 的子串 s [ pos,…,pos +n -1]
    basic_string& append (const basic_string& str);
    basic_string& append (size_type n, E c); //追加 n 个重复字符
    basic_string& append (const_iterator first, const_iterator last); //使用迭代器追加
    
    append() 函数的使用方法为:
    A = "ello";
    cout << A << endl;
    cout << B << endl;
    B.append(A);
    cout << B << endl;
    A = "ello";
    cout << A << endl;
    cout << B << endl;
    B.append("12345",2);
    cout << B << endl;
    A = "ello";
    cout << A << endl;
    cout << B << endl;
    B.append("12345",2,3);
    cout << B << endl;
    A = "ello";
    B = "H";
    cout << A << endl;
    cout << B << endl;
    B.append (10, 'a');
    cout << B << endl;
    A = "ello";
    B = 'H';
    cout << A << endl ;
    cout << B << endl;
    B.append(A.begin(), A, end());
    cout << B << endl;

下面通过一个完整的例子介绍这些函数的使用:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string str1 ("123456");
    string str2 ("abcdefghijklmn");
    string str;
    str.assign(str1);
    cout << str << endl;
    str.assign (str1 , 3, 3);
    cout << str << endl;
    str.assign (str1, 2, str1.npos);
    cout << str << endl;
    str.assign (5, 'X');
    cout << str << endl;
    string::iterator itB;
    string::iterator itE;
    itB = str1.begin ();
    itE = str1.end();
    str.assign (itB, (--itE));
    cout << str << endl;
    str = str1;
    cout << str << endl;
    str.erase(3);
    cout << str << endl;
    str.erase (str.begin (), str.end());
    cout << ":" << str << ":" << endl;
    str.swap(str2);
    cout << str << endl;
    string A ("ello");
    string B ("H");
    B.insert (1, A);
    cout << B << endl;
    A = "ello";
    B ='H';
    B.insert (1, "yanchy ", 3);
    cout << "插入: " << B << endl;
    A = "ello";
    B = "H";
    B.insert(1,A,2,2);
    cout << "插入:" << B << endl;
    A = "ello";
    B = "H";
    B.insert (1,5,'C');
    cout << "插入:" << B << endl;
    A = "ello";
    B = "H";
    string::iterator it = B.begin () +1;
    const string::iterator itF = A.begin ();
    const string::iterator itG = A.end ();
    B.insert(it,itF,itG);
    cout<<"插入:"<< B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A <<", B = " << B << endl ;
    B.append (A);
    cout << "追加:" << B << endl;
    B = "H";
    cout << "A = "<< A << ", B= " << B << endl;
    B.append("12345", 2);
    cout << "追加:" << B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A << ", B= " << B << endl;
    B.append ("12345", 2, 3);
    cout << "追加:" << B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A <<", B = " << B << endl;
    B.append (10 , 'a');
    cout << "追加:"<< B << endl;
    A = "ello";
    B = "H";
    cout << "A = " << A << ", B = " << B << endl;
    B.append(A.begin() , A.end());
    cout << "追加:" << B << endl;
    cin.get();
    return 0;
}

程序运行结果:

123456
456
3456
XXXXX
12345
123456
123
::
abcdefghijklmn
Hello
插入: Hyan
插入:Hlo
插入:HCCCCC
插入:Hello
A = ello, B = H
追加:Hello
A = ello, B= H
追加:H12
A = ello, B= H
追加:H345
A = ello, B = H
追加:Haaaaaaaaaa
A = ello, B = H
追加:Hello

字符串内容的替换
如果在一个字符串中标识出具体位置,便可以通过下标操作修改指定位置字符的值,或者替换某个子串。完成此项操作需要使用 string 类的成员函数 replace()。

replace() 函数的原型如下:
basic_string& replace (size_type p0, size_type n0, const E * s); //使用字符串 s 中的 n 个字符,从源串的位置 P0 处开始替换
basic_string& replace (size_type p0, size_type n0, const E *s, size_type n); //使用字符串 s 中的 n 个字符,从源串的位置 P0 处开始替换 1 个字符
basic_string& replace (size_type p0, size_type n0, const basic_string& str); //使用字符串 s 中的 n 个字符,从源串的位置 P0 处开始替换
basic_string& replace (size_type p0, size_type n0, const basic_string& str, size_type pos, size_type n); //使用串 str 的子串 str [pos, pos + n-1] 替换源串中的内容,从位置 p0 处开始替换,替换字符 n0 个
basic_string& replace (size_type p0, size_type n0, size_type n, E c); //使用 n 个字符 'c' 替换源串中位置 p0 处开始的 n0 个字符
basic_string& replace (iterator first0, iterator last0, const E * s);//使用迭代器替换,和 1) 用法类似
basic_string& replace (iterator first0, iterator last0, const E * s, size_type n);//和 2) 类似
basic_string& replace (iterator first0, iterator last0, const basic_string& str); //和 3) 类似
basic_string& replace (iterator first0, iterator last0, size_type n, E c); //和 5) 类似
basic_string& replace (iterator first0, iterator last0, const_iterator first, const_iterator last); //使用迭代器替换

该函数的使用方法参照下面的程序:

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string var ("abcdefghijklmn");
    const string dest ("1234");
    string dest2 ("567891234");
    var.replace (3,3, dest);
    cout << "1: " << var << endl;
    var = "abcdefghijklmn";
    var.replace (3,1, dest.c_str(), 1, 3);
    cout << "2: " << var << endl;
    var ="abcdefghijklmn";
    var.replace (3, 1, 5, 'x');
    cout << "3: " << var << endl;
    string::iterator itA, itB;
    string::iterator itC, itD;
    itA = var.begin();
    itB = var.end();
    var = "abcdefghijklmn";
    var.replace (itA, itB, dest);
    cout << "4: " << var << endl;
    itA = var.begin ();
    itB = var.end();
    itC = dest2.begin () +1;
    itD = dest2.end ();
    var = "abodefghijklmn";
    var.replace (itA, itB, itC, itD);
    cout << "5: " << var << endl;
    var = "abcdefghijklmn";
    var.replace (3, 1, dest.c_str(), 4); //这种方式会限定字符串替换的最大长度
    cout <<"6: " << var << endl;
    return 0;
}

程序执行结果为:

    1: abc1234ghijklmn
    2: abc234efghijklmn
    3: abcxxxxxefghijklmn
    4: 1234
    5: 67891234efghijklmn
    6: abc1234efghijklmn

本节讲述了诸多可进行字符串内容的修改和替换的函数及其使用方法,并给出了例题。由于每个函数可能有多个原型,希望读者根据自己的情况,掌握其中的一种或两种,以满足自己使用的需要。同时,希望读者能够对照例题的执行效果,认真阅读本章节中的源代码,彻底掌握本节内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ string字符串修改和替换方法详解 的相关文章

随机推荐

  • 使用STM32F4XX自带数学库“arm_math.h“

    使用STM32F4XX自带数学库 arm math h STM32 F4属于Cortex M4F构架 这与M0 M3的最大不同就是具有FPU 浮点运算单元 支持浮点指令集 因此在处理数学运算时能比M0 M3高出数十倍甚至上百倍的性能 但是要
  • 什么是低信噪比图像及处理方法

    信号处理领域的信噪比即SNR Singal to Noise Ration 又称讯噪比 即放大器的输出信号的电压与同时输出的噪声电压的比 常常用分贝数表示 设备的信噪比越高表明它产生的杂音越少 一般来说 信噪比越大 说明混在信号里的噪声越小
  • python (一维、二维)列表的初始化

    一维列表的初始化 初始一个长度为5的列表 方式1 a 0 5 0 0 0 0 0 方式2 a 0 for in range 5 0 0 0 0 0 二维列表的初始化 初始一个2 5的列表 方式1 b 0 5 for in range 2 0
  • Hibernate环境搭建(小实例)

    Hibernate是一个开源的对象关系映射框架 在学习之前 首先让我们先了解一下Hibernate环境是如何搭建的 废话不多说 直接进入正题 建项目 引Jar包 首先 我们需要创建一个Java项目 创建好项目之后 就需要引入与Hiberna
  • unity的HDR效果

    http blog csdn net wolf96 article details 44057915 文章开始先放两组效果 文章结尾再放两组效果 本文测试场景资源来自浅墨大神 shader效果为本文效果 HDR 人们有限的视觉系统 只支持1
  • 【DS】单链表@线性表 —— 增删查改

    目录 0 引 1 链表的概念和结构 2 链表的分类 3 链表的实现 3 1 打印 申请新节点 销毁 3 1 1 打印 3 1 2 申请新节点 3 1 3 销毁 3 2 尾插 尾删 3 2 1 尾插 3 2 2 尾删 3 3 头插 头删 3
  • 物联网场景中,我们如何选择时序数据库 ?

    如今时序数据的应用场景十分广泛 许多类型的数据都是时间序列数据 金融市场交易 传感器测量 水冷 高温 地震 服务器监控 CPU 内存 磁盘 资源消耗 能源 电力 人体健康 心率 血氧浓度 网络访问 通过保留数据固有的时间序列性质 我们可以记
  • mysql:ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value:

    发现某个组件的表单输入报错 Error ER TRUNCATED WRONG VALUE FOR FIELD Incorrect string value xE6 x88 x91 xE4 xBB xAC for column content
  • 【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先

    文章目录 一 题目 二 解法 三 完整代码 所有的LeetCode题解索引 可以看这篇文章 算法和数据结构 LeetCode题解 一 题目 二 解法 思路分析 本题和这道题类似 算法与数据结构 236 LeetCode二叉树的最近公共祖先
  • Linux下Samba的配置

    参考 http www cnblogs com mchina archive 2012 12 18 2816717 html 前言 为了实现windows 和 Linux以及其他操作系统之间的资源共享 软件商推出nfs 和samba两种解决
  • Air101

    目录 1 合宙Air101 固件编译可参考 PinOut V2 1092400 管脚映射表 PinOut V2 1091800 2 Air103 最新固件下载 固件编译可参考 PinOut V3 21112201 管脚映射表 资料链接 Pi
  • Solid JS基础

    Solid js 用于构建用户界面的声明式 高效且灵活的 JavaScript 库 您可以在 官方教程 中尝试下面提到的部分例子 本文引用并简化了官方教程中的部分例子 本文讲述部分 solid 主要内容 更多详细内容 移步 Solid AP
  • 编码器的使用

    首先来看一下增量式编码器的输出信号和它的信号倍频技术 增量式编码器输出的脉冲波形信号形式常见的有两种 一种是占空比50 的方波 通道A和B相位差为90 另一种则是正弦波这类模拟信号 通道A和B相位差同样为90 对于第1种形式的方波信号 如果
  • MATLAB量化浮点数

    在做算法设计和验证时 常在matlab进行浮点验证 然后量化后在用在FPGA上 对于类似与FIR这些滤波器系数 matlab直接可以export出来 但是在验证麦克风或者ADC出来的24bit补码这类时常常需要使用matlab生成定点数进行
  • 有关DHCP、链路聚合、NAT、ACL、Telnet配置小综合实验

    实验需求 1 局域网中存在VLAN10 VLAN20 VLAN30和VLAN40四个部门 IP网段 应192 168 10 0 24 192 168 20 0 24 192 168 30 0 24 192 168 40 0 24 2 业务V
  • Linux虚拟机 Ubuntu16 cheese命令打开摄像头黑屏,以及mjpg-stream框架不显示视频界面。

    在Linux虚拟机 Ubuntu16打开笔记本的摄像头时 用 ubuntu16的cheese命令显示黑屏 如下图 解决方法 1 查看虚拟机是否已经已连接上摄像头 显示断开连接 连接主机 D 则虚拟机已连接上摄像头 2 确认摄像头 笔记本的摄
  • 搭建环境【2】windows主机和ubuntu互传文件的4种方法

    我的ubuntu系统是安装在 VMware 虚拟机中的 两者之间经常要互传文件 下面介绍4种常用的互传文件方法 1 共享文件夹方式互传 在虚拟机中需要开启共享文件夹的功能 首先虚拟机中的ubuntu要求是已经开机了的状态 然后进行设置 虚拟
  • 山东轻工业学院高校俱乐部主席“我和我的CSDN高校俱乐部”

    今天天气不错 上午收到了CSDN邮寄过来的2012年度优秀主席证书以及奖品 心情也不错 感谢CSDN教育事业部全体同事一年来对我们工作的支持与帮助 同时也感谢那些奋战在一线的兄弟姐妹们 你们为轻工学院CSDN高校俱乐部所做的一切 我永远铭记
  • ThreadLocal - ThreadlMap与弱引用

    ThreadLocal源码 在看ThreadLocal源码的时候 其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc static class ThreadLocalMap static class Entr
  • C++ string字符串修改和替换方法详解

    字符串内容的变化包括修改和替换两种 本节将分别讲解字符串内容的修改和字符串内容的替换 字符串内容的修改 可以通过使用多个函数修改字符串的值 例如 assign operator erase 交换 swap 插入 insert 等 另外 还可