当前位置: 首页 > news >正文

c++ 中的字符串相关的操作

在C++中,字符串操作是编程中常见的任务,C++提供了丰富的字符串处理功能,主要分为C风格字符串函数和C++标准库中的std::string类。以下是一些常用的字符串操作函数和方法的介绍:

一、C风格字符串函数(<cstring><string.h>

C风格字符串是以空字符\0结尾的字符数组,C++保留了C语言的字符串处理函数。

1. 字符串长度
size_t strlen(const char* str);  // 返回字符串长度(不包含\0)
2. 字符串复制
char* strcpy(char* dest, const char* src);  // 复制src到dest
char* strncpy(char* dest, const char* src, size_t n);  // 复制最多n个字符
3. 字符串连接
char* strcat(char* dest, const char* src);  // 将src追加到dest末尾
char* strncat(char* dest, const char* src, size_t n);  // 追加最多n个字符
4. 字符串比较
int strcmp(const char* s1, const char* s2);  // 比较s1和s2(字典序)
int strncmp(const char* s1, const char* s2, size_t n);  // 比较前n个字符
5. 字符串查找
const char* strchr(const char* str, int c);  // 查找字符c第一次出现的位置
const char* strstr(const char* haystack, const char* needle);  // 查找子串needle
6. 分割字符串
char* strtok(char* str, const char* delimiters);  // 按分隔符分割字符串

二、C++标准库 std::string<string>

std::string 是C++专用的字符串类,提供了更安全、更方便的面向对象接口。

1. 构造与初始化
std::string s1;                  // 空字符串
std::string s2 = "hello";        // 从C风格字符串初始化
std::string s3(s2);              // 拷贝构造
std::string s4(5, 'a');          // 初始化为"aaaaa"
2. 字符串长度与空判断
s.length();  // 或 s.size(),返回字符串长度
s.empty();   // 判断是否为空
3. 字符串连接
s1 + s2;          // 返回连接后的新字符串
s1 += s2;         // 追加s2到s1末尾
s.append(s2);     // 追加s2
s.append(s2, 0, 3);  // 追加s2的前3个字符
4. 字符串比较
s1 == s2;         // 比较内容是否相等
s1.compare(s2);   // 字典序比较(返回0、正数或负数)
5. 子串与提取
s.substr(pos, len);  // 从pos开始提取长度为len的子串
s.erase(pos, len);   // 删除从pos开始的len个字符
s.replace(pos, len, "new");  // 替换部分内容

这个erase和replace都会直接修改原本的字符串

6. 查找与替换
s.find("sub");      // 查找子串,返回第一次出现的位置(失败返回std::string::npos)
s.rfind("sub");     // 从后向前查找
s.find_first_of("aeiou");  // 查找第一个元音字母
s.replace(pos, len, "new");  // 替换部分内容
7. 字符串修改
s.push_back('c');   // 追加单个字符
s.pop_back();       // 删除最后一个字符(C++11)
s.insert(pos, "text");  // 在pos位置插入文本
8. 字符串与数值转换
// 字符串转数值
std::stoi(s);  // 转为int
std::stol(s);  // 转为long
std::stof(s);  // 转为float// 数值转字符串(C++11)
std::to_string(42);  // 转为"42"

三、字符串流(<sstream>

用于字符串与其他数据类型的转换,以及格式化输出。

1. 字符串转数值
#include <sstream>std::string s = "123";
int num;
std::istringstream(s) >> num;  // 字符串转int
2. 数值转字符串
int num = 123;
std::ostringstream oss;
oss << num;
std::string s = oss.str();  // int转字符串
3. 字符串分割
std::string s = "hello,world";
std::istringstream iss(s);
std::string token;
while (std::getline(iss, token, ',')) {// token为分割后的子串
}

四、其他实用函数

1. 字符处理(<cctype>
std::tolower('A');  // 转为小写
std::toupper('a');  // 转为大写
std::isdigit('5');  // 判断是否为数字
std::isalpha('a');  // 判断是否为字母
2. 字符串修剪(C++20起)
#include <algorithm>
#include <cctype>// 去除左侧空格
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) {return !std::isspace(ch);
}));// 去除右侧空格
s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {return !std::isspace(ch);
}).base(), s.end());

五、注意事项

  1. 性能考虑:频繁修改字符串时,std::string 可能比C风格字符串更高效,但涉及大量插入/删除操作时,可考虑使用 std::stringstreamstd::list<char>
  2. 编码问题:上述函数默认处理ASCII或单字节字符,处理Unicode字符串需使用 std::wstringstd::u16string 或第三方库(如ICU)。
  3. 安全性std::string 避免了C风格字符串的缓冲区溢出风险,但仍需注意边界检查。

掌握这些函数和方法后,你可以处理绝大多数C++字符串操作需求。如果需要更复杂的功能(如正则表达式),可以使用 <regex> 库。

http://www.lryc.cn/news/602036.html

相关文章:

  • 「源力觉醒 创作者计划」_文心大模型4.5系列开源模型,意味着什么?对开发者、对行业生态有何影响?
  • 重复文件清理工具,附免费链接
  • 聊聊工业相机中的硬触发、软触发和视频流模式
  • MFC UI对话框
  • puppeteer 系列模块的系统性、详细讲解
  • 使用JavaScript实现一个代办事项的小案例
  • 八大神经网络的区别
  • 【RH134 问答题】第 6 章 管理 SELinux 安全性
  • 计算机网络(基础篇)
  • 《零基础入门AI: 从轮廓查找到形态学变换(OpenCV图像预处理)》
  • 【深度学习新浪潮】基于文字生成3D城市景观的算法有哪些?
  • Leaflet 综合案例-聚类图层控制
  • Python快速入门(2025版):输入
  • 婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
  • C++ list 容器全解析:从构造到模拟实现的深度探索----《Hello C++ Wrold!》(16)--(C/C++)
  • 数值计算 | 图解基于龙格库塔法的微分方程计算与连续系统离散化(附Python实现)
  • C primer plus (第六版)第九章 编程练习第6题
  • 【Rust异步】async和await异步编程实战:高并发任务处理全解析
  • Java 排序
  • 股指期货周度想法
  • RWA 正当红,是 DeFi 的终点、拐点,还是新起点?
  • 【C++】手搓一个STL风格的vector容器
  • 7.DRF 过滤、排序、分页
  • 开发指南125-HTML DOM事件
  • 【Linux篇章】穿越数据迷雾:HTTPS构筑网络安全的量子级护盾,重塑数字信任帝国!
  • Kafka——请求是怎么被处理的?
  • 云原生MySQL Operator开发实战(三):高级特性与生产就绪功能
  • RabbitMQ+内网穿透远程访问教程:实现异地AMQP通信+Web管理
  • MongoDB索引及其原理
  • Java#包管理器来时的路