C/C++字符串操作

C/C++对字符串的操作提供了丰富的函数库,这些函数可以用于创建、修改、比较和搜索字符串等。以下是一些常用的字符串操作函数及其使用说明:

C语言中的字符串操作

在C语言中,字符串通常以字符数组的形式存在,并以空字符(\0)结尾。C标准库提供了一系列字符串操作函数,如:

1. strlen()
  • 功能:计算字符串的长度(不包括结束符\0)。
  • 参数:一个指向字符串的指针。
  • 返回值:字符串的长度。
#include <string.h>char str[] = "Hello, world!";
size_t len = strlen(str); // len 现在是 13
2. strcpy()
  • 功能:复制一个字符串到另一个字符串。
  • 参数:目标字符串的指针和源字符串的指针。
  • 返回值:目标字符串的指针。
#include <string.h>char src[] = "Hello, world!";
char dest[50];
strcpy(dest, src); // dest 现在包含 "Hello, world!"
3. strcat()
  • 功能:连接两个字符串。
  • 参数:目标字符串的指针和要追加的字符串的指针。
  • 返回值:目标字符串的指针。
#include <string.h>char str1[30] = "Hello, ";
char str2[] = "world!";
strcat(str1, str2); // str1 现在是 "Hello, world!"
4. strcmp()
  • 功能:比较两个字符串。
  • 参数:两个字符串的指针。
  • 返回值:如果字符串相等则返回0;如果第一个字符串小于第二个字符串,则返回一个负数;如果第一个字符串大于第二个字符串,则返回一个正数。
#include <string.h>char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2); // result 是负数,因为 "apple" 在字典序上小于 "banana"

C++中的字符串操作

在C++中,建议使用 std::string 类来处理字符串,它提供了更强大、更安全且更易于使用的接口。

  1. 构造函数
    • 功能:创建 std::string 对象。
    • 参数:可以是C风格的字符串、字符、另一个 std::string 对象等。
#include <string>std::string str1 = "Hello, world!"; // 使用C风格字符串初始化
std::string str2(str1); // 使用另一个std::string对象初始化
std::string str3(10, 'c'); // 创建包含10个字符'c'的字符串
  1. 成员函数
    • std::string 类提供了大量的成员函数来操作字符串,如 length()append()compare() 等。
std::string str = "Hello";
size_t len = str.length(); // 获取长度
str.append(", world!"); // 追加字符串
int cmp = str.compare("Hello, world!"); // 比较字符串
  1. 操作符重载
    • std::string 类重载了操作符如 ++===!= 等,使得字符串操作更加直观。
std::string str1 = "Hello";
std::string str2 = " ";
str2 += "world!"; // 使用 += 操作符追加字符串
std::string str3 = str1 + str2; // 使用 + 操作符连接字符串

C++的 std::string 类提供了比C语言更强大、更灵活且更安全的字符串处理能力,因此在C++程序中通常推荐使用 std::string 而不是C风格的字符串。当然,在需要与C语言库或系统调用交互时,仍然可能会使用C风格的字符串和相应的操作函数。

在C++中,std::string类提供了许多便捷的函数来操作字符串。下面是一些std::string类中常用的字符串操作函数及其用法:

构造函数

std::string有多个构造函数,可以用来以不同方式初始化字符串对象。

std::string str1; // 默认构造函数,创建一个空字符串
std::string str2("Hello"); // 使用C风格字符串初始化
std::string str3(5, 'c'); // 使用字符和重复次数初始化
std::string str4(str2); // 使用另一个std::string对象初始化

长度和容量

size_t len = str.length(); // 返回字符串的长度(不包括结尾的空字符)
size_t cap = str.capacity(); // 返回当前分配的存储容量
bool empty = str.empty(); // 检查字符串是否为空

访问元素

char ch = str[index]; // 通过索引访问字符(索引从0开始)
char& ref = str.at(index); // 通过索引访问字符,如果索引越界则抛出异常

修改操作

str.append(" world"); // 在字符串末尾追加字符或字符串
str.push_back('!'); // 在字符串末尾添加一个字符
str.insert(pos, "inserted"); // 在指定位置插入字符或字符串
str.erase(pos, len); // 删除从指定位置开始的指定长度的字符
str.replace(pos, len, "replacement"); // 替换从指定位置开始的指定长度的字符为新的字符串
str.clear(); // 清除字符串内容,使其变为空字符串

比较操作

int cmp = str.compare(other_str); // 比较两个字符串,返回负数、0或正数,根据字典顺序
bool equal = (str == other_str); // 检查两个字符串是否相等
bool not_equal = (str != other_str); // 检查两个字符串是否不相等
bool less = (str < other_str); // 检查一个字符串是否小于另一个
bool greater = (str > other_str); // 检查一个字符串是否大于另一个
bool less_equal = (str <= other_str); // 检查一个字符串是否小于或等于另一个
bool greater_equal = (str >= other_str); // 检查一个字符串是否大于或等于另一个

搜索和查找

size_t pos = str.find("substring"); // 查找子字符串首次出现的位置
size_t rpos = str.rfind("substring"); // 查找子字符串最后一次出现的位置
size_t pos_of_char = str.find_first_of("chars"); // 查找字符串中任一字符首次出现的位置
size_t rpos_of_char = str.find_last_of("chars"); // 查找字符串中任一字符最后一次出现的位置
size_t pos_not_of_char = str.find_first_not_of("chars"); // 查找第一个不在指定字符集中的字符位置

子字符串和拼接

std::string substr = str.substr(pos, len); // 获取从指定位置开始的指定长度的子字符串
str += " another string"; // 拼接另一个字符串到当前字符串末尾

转换

int num = std::stoi(str); // 将字符串转换为int类型
double dnum = std::stod(str); // 将字符串转换为double类型
std::string num_str = std::to_string(42); // 将整数转换为字符串

这些只是std::string类提供的一部分函数,实际上它还有更多的成员函数和操作符可以用来操作字符串。使用这些函数可以大大简化字符串的处理工作,并提供了一种类型安全且易于使用的方式来操作字符串。记得在使用这些函数时包含头文件<string>

C++还有<cstring>头文件。这个头文件是C标准库头文件<string.h>的C++版本。它包含了C风格的字符串处理函数,如memcpy(), memmove(), memset(), strcmp(), strcpy(), strcat()等。

在C++中,虽然推荐使用std::string类来进行字符串操作,因为它提供了更安全、更方便的接口,但在某些情况下,你可能仍然需要使用C风格的字符串,或者与C语言的库或API进行交互,这时<cstring>头文件就非常有用。

使用<cstring>头文件时,需要包含它,然后就可以使用其中的函数了。例如:

#include <cstring>int main() {char str1[50] = "Hello";char str2[50] = "World";// 使用cstring中的函数进行字符串连接strcat(str1, " ");strcat(str1, str2);return 0;
}

这段代码将str1str2连接在一起,并在它们之间添加一个空格。注意,使用strcat()等函数时需要确保目标字符串有足够的空间来容纳源字符串,否则可能会导致缓冲区溢出。因此,在使用这些函数时需要格外小心。

memcpy(), memmove(), memset(), strcmp(), strcpy(), strcat()都是C和C++标准库中的字符串和内存操作函数。以下是它们的参数和如何使用它们的说明:

  1. memcpy()

memcpy()函数用于从源内存块复制指定字节数的数据到目标内存块。

函数原型:

void *memcpy(void *dest, const void *src, size_t n);

参数:

  • dest:指向目标内存块的指针。
  • src:指向源内存块的指针。
  • n:要复制的字节数。

使用示例:

char src[] = "Hello";
char dest[10];
memcpy(dest, src, 5); // 将src的前5个字节复制到dest
  1. memmove()

memmove()函数用于从源内存块复制指定字节数的数据到目标内存块,即使源和目标内存块重叠。

函数原型:

void *memmove(void *dest, const void *src, size_t n);

参数:

  • dest:指向目标内存块的指针。
  • src:指向源内存块的指针。
  • n:要复制的字节数。

使用示例:

char src[] = "Hello World";
char dest[20];
memmove(dest + 6, src, 5); // 将src的前5个字节复制到dest的第6个位置开始
  1. memset()

memset()函数用于将指定的值填充到目标内存块的每个字节中。

函数原型:

void *memset(void *s, int c, size_t n);

参数:

  • s:指向目标内存块的指针。
  • c:要填充的值,以unsigned char的形式解释。
  • n:要填充的字节数。

使用示例:

char dest[10];
memset(dest, '0', 10); // 将dest的每个字节都填充为'0'
  1. strcmp()

strcmp()函数用于比较两个字符串。

函数原型:

int strcmp(const char *s1, const char *s2);

参数:

  • s1:指向第一个字符串的指针。
  • s2:指向第二个字符串的指针。

返回值:

  • 如果s1小于s2,返回负整数。
  • 如果s1等于s2,返回0。
  • 如果s1大于s2,返回正整数。

使用示例:

char str1[] = "Hello";
char str2[] = "World";
int result = strcmp(str1, str2); // 比较str1和str2
  1. strcpy()

strcpy()函数用于将源字符串复制到目标字符串中。

函数原型:

char *strcpy(char *dest, const char *src);

参数:

  • dest:指向目标字符串的指针。
  • src:指向源字符串的指针。

使用示例:

char src[] = "Hello";
char dest[10];
strcpy(dest, src); // 将src复制到dest
  1. strcat()

strcat()函数用于将源字符串追加到目标字符串的末尾。

函数原型:

char *strcat(char *dest, const char *src);

参数:

  • dest:指向目标字符串的指针。
  • src:指向源字符串的指针。

使用错误示例:

char dest[] = "Hello";
char src[] = " World";
strcat(dest, src); // 将src追加到dest的末尾

请注意,在使用这些函数时,应确保目标内存块或字符串具有足够的空间来容纳复制或追加的数据,以避免缓冲区溢出等安全问题。此外,当处理字符串时,还需要注意字符串的终止字符’\0’。

因此上述代码的正确形式应该为:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {char dest[] = "Hello";char src[] = " World";int dest_len = strlen(dest);int src_len = strlen(src);int total_len = dest_len + src_len;char *result = (char *)malloc((total_len + 1) * sizeof(char));if (result == NULL) {printf("内存分配失败");return 1;}strcpy(result, dest);strcat(result, src);printf("%s", result);free(result);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中注册Bean的方式汇总

文章目录 ComponentScan Componet相关注解BeanImportspring.factories总结Configuration和Component的主要区别&#xff1f;Bean是不是必须和Configuration一起使用&#xff1f;Import导入配置类有意义&#xff1f;出现异常&#xff1a;java.lang.NoClassDefFoundError: Could…

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama&#xff08;CPU only版&#xff09;》 介绍了如何一键快捷部署Ollama&#xff0c;今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数&#xff1a;2B&#xff08;1.6GB&#xff09;、7B&#xff…

TCP协议--传输机制

TCP协议原理 TCP协议是对数据传输提供的一个管控机制&#xff0c;主要体现在可靠和效率两个方面&#xff0c;即在保证数据可靠传输的情况下尽可能的提高效率 可靠传输机制 确认应答机制 向对方发送一个数据报&#xff0c;对方要返回一个确认应答的数据报 实现的方式&#x…

文心一言 VS 讯飞星火 VS chatgpt (236)-- 算法导论17.3 2题

二、使用势能法重做练习17.1-3。练习17.1-3的内容是&#xff1a;假定我们对一个数据结构执行一个由 n 个操作组成的操作序列&#xff0c;当 i 严格为 2 的幂时第 i 个操作的代价为 i &#xff0c;否则代价为1。使用聚合分析确定每个操作的摊还代价。如果要写代码&#xff0c;请…

JAVA实现人工智能,采用框架SpringAI

Spring AI介绍 Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话应用程序。 项目地址&#xff1a;https://github.com/spring-projects-experimental/sp…

AGV小车导航避障雷达SE-0533(CNS-LS05C)激光传感器RS232|RS485|CAN BUS连线说明

AGV小车导航避障雷达SE-0533(CNS-LS05C)激光传感器广泛应用到AGV小车&#xff0c;RGV小车&#xff0c;无人叉车、搬运机器人等领域。本文重点介绍AGV小车导航避障雷达SE-0533(CNS-LS05C)激光传感器RS232|RS485|CAN BUS连线说明。 一、线序定义 1、传感器线缆线序定义 SE-053…

用栈来模拟队列

思路&#xff1a;首先栈是先进后出&#xff0c;队列是先进先出&#xff0c;所以用两个栈来模拟队列&#xff0c;一个用来进&#xff0c;一个用来出&#xff0c;用来进的再弹给用来出的便是队列的顺序了&#xff0c;具体代码如下 class MyQueue { public: stack<int> sa…

分层风格的软件架构设计概念及其实际应用

摘要 分层风格的软件架构是一种将系统功能分解成多个层次的设计模式&#xff0c;每个层次负责特定的功能&#xff0c;层与层之间通过定义良好的接口进行交互。这种架构风格广泛应用于多种软件系统&#xff0c;如企业应用、操作系统和网络协议等。本文将探讨分层架构的基本概念…

C++引用和右值引用

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

postgis导入shp数据时“dbf file (.dbf) can not be opened.“

作者进行矢量数据导入数据库中出现上述报错 导致报错原因 导入的shp文件路径太深导入的shp文件名称或路径中有中文将需要导入数据的shp 文件、dbf 文件、prj 等文件放在到同一个文件夹内&#xff0c;且名字要一致&#xff1b;导入失败&#xff1a; 导入成功&#xff1a;

js基础知识+练习

一&#xff0c;JavaScript简单了解 1.什么是JavaScript JavaScript简称JS&#xff0c;是较为流行的一种前端编程语言&#xff0c;是一种脚本语言&#xff0c;通过解释器运行&#xff0c;主要在客户端&#xff08;浏览器&#xff09;上运行&#xff0c;现在也可以基于node.js在服…

Python实现外观模式、桥接模式、组合模式和享元模式

今天介绍四种结构型设计模式&#xff1a;外观模式、桥接模式、组合模式和享元模式 外观模式 外观模式&#xff08;Facade Pattern&#xff09;&#xff0c;它为子系统提供一个统一的接口&#xff0c;使得子系统更加容易使用。 在Python中&#xff0c;我们可以通过定义一个外…

MYSQL08_页的概述、内部结构、文件头、文件尾、最大最小记录、页目录、区段表

文章目录 ①. 页的概述、大小②. 页的内部结构③. 第一部分 - 文件头④. 第一部分 - 文件尾⑤. 第二部分 - 空闲、用户记录、最大最小⑥. 第三部分 - 页目录⑦. 第三部分 - 页面头部⑧. 从数据页角度看B树⑨. 区、段和表、碎片区 ①. 页的概述、大小 ①. 数据库的存储结构&…

YOLO系列汇总 | 持续更新

文章目录 1 YOLOv1(2015, Joseph Redmon)2 YOLOv2(2016, Joseph Redmon)3 YOLOv3(2018, Joseph Redmon)4 YOLOv4(2020, Alexey Bochkovskiy, Chien-Yao Wang)5 YOLOV5(2021&#xff0c;Ultralytics)6 YOLOX(2021, Megvii旷视)7 YOLOv6(2022&#xff0c;美团)8 YOLOv7(2022&…

【深度学习】多层感知机与卷积神经网络解析

引言&#xff1a; 在人工智能的宏伟画卷中&#xff0c;深度学习如同一笔瑰丽而深邃的色彩&#xff0c;为这幅画增添了无限的生命力和潜能。作为支撑这一领域核心技术的基石&#xff0c;多层感知机&#xff08;MLP&#xff09;和卷积神经网络&#xff08;CNN&#xff09;在模仿人…

vivado ila 运行触发器、停止触发器、使用自动重新触发

运行触发器 您可在 2 种不同模式下运行或装备 ILA 核触发器 &#xff1a; • “ Run Trigger ” &#xff1a; 选择要装备的 ILA 核 &#xff0c; 然后单击“ ILA 仪表板 (ILA Dashboard) ”窗口或“硬件 (Hardware) ”窗口 工具栏上的“ Run Trigger ”按钮即可装备 IL…

MySQL :事务隔离级别实现方法

事务具有四个特性 原子性&#xff0c;要么全成功要么全失败&#xff0c;通过undo log实现持久性&#xff0c;不会因为断电等特殊情况造成数据丢失&#xff0c;通过redo log实现隔离性&#xff0c;事务之间互相不干扰&#xff0c;通过MVCC实现一致性&#xff0c;事务执行前后整…

双指针运用:删除重复元素、移除元素

26.删除重复元素 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元…

Android Gradle开发与应用 (八) :Kotlin DSL

1. 前言 本文介绍了Gradle Kotlin DSL相关的一些知识点 2. DSL是什么 DSL是为特定领域设计的专门的语言&#xff0c;也就是设计了一门语言&#xff0c;然后解决某个特定的领域的特定问题。 2.1 举例说明 以下的这些都可以称之为DSL 正则表达式 :用于文本处理的特定语言SQ…

Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性&#xff0c;即一个线程修改了某个变量的值&#xff0c;这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 1.volatile的可见性 一个典型的例子&#xff1a;永不停止的循环。 public class Forever…