C++ 字符串(string)常用操作总结

2023-05-16

目录

0、常用功能汇总

1、定义一个字符串

2、读写 string 操作

3、查询字符串信息、索引

4、拼接、比较等操作

5、cctype 头文件(判断字符类型:大/小写字母、标点、数字等)

6、for 循环遍历

7、修改 string 的操作

8、string 搜索操作

9、string、char 型与数值的转换

10、字符串反转 

11、提取字串


单引号括起来的一个字符被称作 char 型字面值双引号括起来的零个或多个字符则构成字符串型字面值。字符串字面值的类型实际上就是由常量字符构成的数组,,编译器在每一个字符串后面添加一个空字符('\0'),因此字符串的实际长度要比他的内容多1。

如字面值 'A' 表示的就是单独字符 A ,而字符串 "A" 代表了一个包含两个字符的字符数组,分别是字母 A 和空字符。

0、常用功能汇总

s.insert(pos, args)  在 pos 之前插入 args 指定的字符
s.erase(pos, len)  删除从 pos 开始的 len 个字符。如果 len 省略,则删除 pos 开始的后面所有字符。返回一个指向 s 的引用。
s.assign(args)  将 s 中的字符替换为 args 指定的字符。返回一个指向 s 的引用。
s.append(args)  将 args 追加到 s 。返回一个指向 s 的引用。args 必须是双引号字符串
s.replace(range, args) 将 s 中范围为 range 内的字符替换为 args 指定的字符
s.find(args) 查找 s 中 args 第一次出现的位置
s.rfind(args) 查找 s 中 args 最后一次出现的位置
to_string(val)将数值 val 转换为 string 并返回。val 可以是任何算术类型(int、浮点型等)
stoi(s) / atoi(c)字符串/字符 转换为整数并返回
stof(s) / atof(s)字符串/字符 转换为浮点数并返回
s.substr(pos, n)从索引 pos 开始,提取连续的 n 个字符,包括 pos 位置的字符
reverse(s2.begin(), s2.end())反转 string 定义的字符串 s2 (加头文件 <algorithm>

1、定义一个字符串

使用标准库类型 string 声明并初始化一个字符串,需要包含头文件 string。可以初始化的方式如下:

    string s1;    // 初始化一个空字符串
    string s2 = s1;   // 初始化s2,并用s1初始化
    string s3(s2);    // 作用同上
    string s4 = "hello world";   // 用 "hello world" 初始化 s4,除了最后的空字符外其他都拷贝到s4中
    string s5("hello world");    // 作用同上
    string s6(6,'a');  // 初始化s6为:aaaaaa
    string s7(s6, 3);  // s7 是从 s6 的下标 3 开始的字符拷贝
    string s8(s6, pos, len);  // s7 是从 s6 的下标 pos 开始的 len 个字符的拷贝

使用 = 的是拷贝初始化,使用 () 的是直接初始化。当初始值只有一个时,两者都可。当初始值有多个时一般来说要使用直接初始化,如上述最后一个的形式。

2、读写 string 操作

输入时遇到空格或回车键将停止。但需要注意的是只有按下回车键时才会结束输入执行,当按下空格后还能继续输入,但最终存到字符串中的只是第一个空格之前输入的字符串(开头的空白除外,程序会自动忽略开头的空白的),空格操作可以用来同时对多个字符串进行初始化,如下例

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    string s1, s2, s3;    // 初始化一个空字符串
    // 单字符串输入,读入字符串,遇到空格或回车停止
    cin >> s1;  
    // 多字符串的输入,遇到空格代表当前字符串赋值完成,转到下个字符串赋值,回车停止
    cin >> s2 >> s3;  
    // 输出字符串 
    cout << s1 << endl; 
    cout << s2 << endl;
    cout << s3 << endl;   
    return 0;
}
// 运行结果 //
  abc def hig
abc
def
hig

如果希望在最终读入的字符串中保留空格,可以使用 getline 函数,例子如下:

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
    string s1 ;    // 初始化一个空字符串
    getline(cin , s1); 
    cout << s1 << endl;  // 输出
    return 0;
}
// 结果输出 //
abc def hi
abc def hi

3、查询字符串信息、索引

可以用 empty size/length 查询字符串状态及长度,可以用下标操作提取字符串中的字符。 

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    string s1 = "abc";    // 初始化一个字符串
    cout << s1.empty() << endl;  // s 为空返回 true,否则返回 false
    cout << s1.size() << endl;   // 返回 s 中字符个数,不包含空字符
    cout << s1.length() << endl;   // 作用同上
    cout << s1[1] << endl;  // 字符串本质是字符数组
    cout << s1[3] << endl;  // 空字符还是存在的
    return 0;
}
// 运行结果 //
0
3
3
b

4、拼接、比较等操作

s1+s2          // 返回 s1 和 s2 拼接后的结果。加号两边至少有一个 string 对象,不能都是字面值
s1 == s2       // 如果 s1 和 s2 中的元素完全相等则它们相等,区分大小写
s1 != s2
<, <=, >, >=   // 利用字符的字典序进行比较,区分大小写

5、cctype 头文件(判断字符类型:大/小写字母、标点、数字等)

cctype 头文件中含有对 string 中字符操作的库函数,如下:

isalnum(c)  // 当是字母或数字时为真
isalpha(c)  // 当是字母时为真
isdigit(c)  // 当是数字是为真
islower(c)  // 当是小写字母时为真
isupper(c)  // 当是大写字母时为真
isspace(c)  // 当是空白(空格、回车、换行、制表符等)时为真
isxdigit(c) // 当是16进制数字是为真
ispunct(c)  // 当是标点符号时为真(即c不是 控制字符、数字、字母、可打印空白 中的一种)
isprint(c)  // 当时可打印字符时为真(即c是空格或具有可见形式)
isgraph(c)  // 当不是空格但可打印时为真
iscntrl(c)  // 当是控制字符时为真
tolower(c)  // 若c是大写字母,转换为小写输出,否则原样输出
toupper(c)  // 类似上面的

6、for 循环遍历

可以使用 c++11 标准的 for(declaration: expression) 形式循环遍历,例子如下:

如果想要改变 string 对象中的值,必须把循环变量定义为引用类型

#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main(void)
{
    string s1 = "nice to meet you~";    // 初始化一个空字符串
    // 如果想要改变 string 对象中的值,必须把循环变量定义为引用类型。引用只是个别名,相当于对原始数据进行操作
    for(auto &c : s1)  
        c = toupper(c); 
    cout << s1 << endl; // 输出
    return 0;
}
// 运行结果 //
NICE TO MEET YOU~

7、修改 string 的操作

在 pos 之前插入 args 指定的字符。pos是一个下标或者迭代器。接受下标的版本返回一个指向 s 的引用;接受迭代器的版本返回一个指向第一个插入字符的迭代器 

s.insert(pos, args)  
// 在 s 的位置 0 之前插入 s2 的拷贝
s.insert(0, s2)  

删除从 pos 开始的 len 个字符。如果 len 省略,则删除 pos 开始的后面所有字符。返回一个指向 s 的引用。

s.erase(pos, len)  

将 s 中的字符替换为 args 指定的字符。返回一个指向 s 的引用。

s.assign(args)  

将 args 追加到 s 。返回一个指向 s 的引用。args 不能是单引号字符,若是单个字符则必须用双引号表示。如,可以是 s.append("A") 但不能是 s.append('A')    

s.append(args)  

将 s 中范围为 range 内的字符替换为 args 指定的字符。range 或者是一个下标或长度,或者是一对指向 s 的迭代器。返回一个指向 s 的引用。

s.replace(range, args) 
// 从位置 3 开始,删除 6 个字符,并插入 "aaa".删除插入的字符数量不必相等
s.replace(3, 6, "aaa")  

8、string 搜索操作

搜索操作返回指定字符出现的下标,如果未找到返回 npos 

s.find(args)  // 查找 s 中 args 第一次出现的位置
s.rfind(args)  // 查找 s 中 args 最后一次出现的位置

在 s 中查找 args 中任何一个字符 最早/最晚 出现的位置

s.find_first_of(args)  // 在 s 中查找 args 中任何一个字符最早出现的位置
s.find_last_of(args)  // 在 s 中查找 args 中任何一个字符最晚出现的位置
例如:
string s1 = "nice to meet you~"; 
cout << s1.find_first_of("mey") << endl; // 输出结果为 3,'e' 出现的最早

在 s 中查找 第一个/最后一个 不在 args 中的字符的位置

s.find_first_not_of(args)  // 查找 s 中 第一个不在 args 中的字符的位置
s.find_last_not_of(args)  // 查找 s 中 最后一个不在 args 中的字符的位置
例如:
string s1 = "nice to meet you~";  
cout << s1.find_first_not_of("nop") << endl; // 输出结果为 1 ,'i' 不在 "nop" 里

9、string、char 型与数值的转换

1、将数值 val 转换为 string 。val 可以是任何算术类型(int、浮点型等)。

string s = to_string(val)

2、转换为整数并返回。返回类型分别是 int、long、unsigned long、long long、unsigned long long。b 表示转换所用的进制数,默认为10,即将字符串当作几进制的数转换,最终结果仍然是十进制的表示形式 。p 是 size_t  指针,用来保存 s 中第一个非数值字符的下标,默认为0,即函数不保存下标,该参数也可以是空指针,在这种情况下不使用。

stoi(s)
// 函数原型 int stoi (const string&  str, size_t* idx = 0, int base = 10);
stoi(s, p, b)
stol(s, p, b)
stoul(s, p, b)
stoll(s, p, b)
stoull(s, p, b)
// 例如
string s1 = "11";    // 初始化一个空字符串
int a1 = stoi(s1);
cout << a1 << endl; // 输出 11
int a2 = stoi(s1, nullptr, 8);
cout << a2 << endl; // 输出 9
int a3 = stoi(s1, nullptr, 2);
cout << a3 << endl; // 输出 3

3、转换为浮点数并返回。返回类型分别是 float、double、long double 。p 是 size_t  指针,用来保存 s 中第一个非数值字符的下标,默认为0,即函数不保存下标,该参数也可以是空指针,在这种情况下不使用。

stof(s)
stof(s, p)
stod(s, p)
stold(s, p)

4、char 型转数值。注意传入的参数是指针类型,即要对字符取地址

atoi(c)
// 函数原型 int atoi(const char *_Str)
atol(c)
atoll(c)
atof(c)

10、字符串反转 

使用 <algorithm> 头文件中的 reverse() 方法:

    string s2 = "12345";    // 初始化一个字符串
    reverse(s2.begin(), s2.end()); // 反转 string 定义的字符串 s2 
    cout << s2 << endl; // 输出 54321

11、提取字串

 使用  string ss = s.substr(pos, n) 。从索引 pos 开始,提取连续的 n 个字符,包括 pos 位置的字符。函数原型:

inline std::__cxx11::string std::__cxx11::string::substr(std::size_t __pos, std::size_t __n) const

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

C++ 字符串(string)常用操作总结 的相关文章

随机推荐

  • python Jetson tx2和 stm32之间的通信(16进制和10进制的转换,包括负数),BCC校验(异或)运算

    tx2接收16进制数据 含16进制转化为10进制 xff0c 负数怎么表示 我发现tx2接收stm32的16进制的数据 xff0c 不能达到我想要的效果 并且16进制数还会转换成ASCLL码的字符 如下图 xff1a 通过如下操作可以获得字
  • ROS 学习记录(五)

    在运行moveit xff01 例程的时候发现没有Moveit包 xff0c 于是在网上下载 xff0c 发现普通的 sudo apt get install ros kinetic moveit 无法完成安装 会提示找不到安装包 尝试更换
  • rosbag使用介绍

    rosbag 1 录制包 span class token comment 录制所有的topic span rosbag record span class token operator span a 2 查看包的信息 rosbag inf
  • Python基础

    输出函数print 输出内容可以是 1 数字 print 66 6 2 字符串 print hello world 单引号双引号都可 3 含有运算符的表达式 print 3 43 1 4 输出到文件中 fp 61 open D text t
  • PID控制器的优缺点和周期

    PID控制器参数优缺点 PID控制器简介 PID控制器是非常经典的一种控制算法 xff0c 是不需要知道系统的模型 xff0c 仅仅根据期望与现状的偏差调节 xff0c 使之能够到达期望的一种线性控制器 优点 xff1a 使用简单 xff0
  • 嵌入式开发自救指南(嵌入式怎么高薪基本思路)

    文章目录 前言打工的基本逻辑 xff1a 生产者思维价值与价格概念介绍需求与价值供给与价值 总结 一 为什么选择嵌入式四个角度个人需求现有资源与长板职业优先级排序 二 距离目标还有多远距离目标距离 三 路线半年路线为什么这样做 前言 为什么
  • docker安装firefox

    下载镜像 docker pull jlesage firefox 运行容器 docker run d name 61 firefox e TZ 61 Asia Hong Kong p 5800 5800 p 5900 5900 shm si
  • freertos学习之路1-裸机和rtos的区别

    写在最前 由于工作需要 xff0c 需要开始学习freertos的相关知识 xff0c 本专题主要记录freertos的相关内容 参考 xff1a https www bilibili com video BV19g411p7UT 正点原子
  • Windows10 配置 VSCode 的 C++环境

    目录 0 不同符号代表的 CPU 的位数 xff1a 1 下载 MinGW64 包 xff0c 配置C C 43 43 的Windows环境 2 在 VSCode 里配置 C 43 43 0 不同符号代表的 CPU 的位数 xff1a x8
  • MPU MCU CPU GPU之间的关系

    CPU xff08 Central Processing Unit xff0c 中央处理器 是计算机系统的主要处理器 xff0c 它负责执行指令 处理数据和控制计算机系统的操作 CPU通常被用于通用计算和控制任务 xff0c 如桌面电脑 服
  • stm32外设-中断详解

    0 写在最前 本栏目笔记都是基于stm32F10x 1 中断是啥 xff1f 什么是中断 xff1a CPU在处理某一事件A时 xff0c 发生的另外某一事件B请求CPU去处理 xff08 产生了中断 xff09 xff0c 随后CPU暂时
  • Darknet——yolo3训练自己的数据集+在ros环境下实现目标检测实战教程(三)——应用在ROS上

    文章目录 前言一 darknet ros代码简析二 修改ros驱动包的文件内容三 ros系统下运行效果总结 前言 Darknet yolo3训练自己的数据集 43 在ros环境下实现目标检测实战教程 xff08 一 xff09 环境配置 D
  • LSB(Linux Standard Base)通用部分学习自用(1)

    前言 什么是LSB xff08 借用了这位博主的高见 xff09 LSB文档下载 自用 xff0c 如有错误请指出 xff0c 不胜感激 本系列基于LSB Core Generic 5 0 介绍 The LSB defines a bina
  • cocos2dx 第七课 动作和动画

    一 动作的行为 runAction Action act 运行动作 stopAction Action act 停止动作 stopActionByTag int tag 停止动作 stopAllActions 停止节点所有动作 二 动作的种
  • 线性最小方差估计理论推导

    线性最小方差估计理论推导 定义 也叫线性最小均方误差估计 xff0c 顾名思义 xff0c 就是使估计误差的平方和的均值达到最小 理论推导 假设系统 z 61 H x 43
  • D435i、D435、D415、T265的Realsense_viewer环境搭配及安装

    安装步骤 1 注册服务器公钥 sudo apt span class token operator span key adv span class token operator span keyserver keys span class
  • VS Code下利用Cmake开发C++-单文件

    单文件 xff1a 第一步 xff1a 创建CmakeLists txt文件 第二步 xff1a 编写CmakeLists 设置最小版本 span class token function cmake minimum required sp
  • ECharts学习--主题设置

    xff08 1 xff09 内置主题 echarts中默认主题有两个 light dark 在初始化对象方法中 xff0c init可以指明 xff1a xff08 1 xff09 dark var mCharts 61 echarts i
  • 隔壁老王看了都会的文章:STM32串口实验——单片机与上位机交互信息

    今天介绍USART串口通信的使用 xff0c 目的在于会用串口传送和接收数据 内容包含了NVIC中断的知识 xff0c 下一篇着重讲NVIC中断 ADC在下下一篇 主要还是先看懂USART的相关代码 什么是串行通信 我们对通信的字面意思理解
  • C++ 字符串(string)常用操作总结

    目录 0 常用功能汇总 1 定义一个字符串 2 读写 string 操作 3 查询字符串信息 索引 4 拼接 比较等操作 5 cctype 头文件 判断字符类型 xff1a 大 小写字母 标点 数字等 6 for 循环遍历 7 修改 str