C++ #include <cstring>(详解)

news2024/9/17 7:34:23

里面有疑问或者不正确的地方可以给我留言。

#include <cstring> 是在 C++ 程序中引入头文件 <cstring> 的语句。这个头文件提供了用于处理 C 风格字符串(即以空字符 '\0' 结尾的字符数组)的函数。

具体来说,<cstring> 定义了一些常用的字符串操作函数,如:

(1)strcpy: 复制字符串。

strcpycstring 中用于复制 C 风格字符串的函数,它将源字符串的内容复制到目标字符串中,包括末尾的空字符 ('\0')。使用 strcpy 时需要确保目标数组有足够的空间来存放源字符串。

char* strcpy(char* destination, const char* source);
  • destination:目标字符数组,存放复制后的字符串。
  • source:源字符数组,被复制的字符串。

示例代码:

#include <iostream>
#include <cstring>

int main() {
    // 创建源字符串
    const char source[] = "Hello, World!";
    
    // 创建目标数组,确保大小足够容纳源字符串
    char destination[20];
    
    // 使用 strcpy 复制字符串
    std::strcpy(destination, source);
    
    // 输出结果
    std::cout << "Source: " << source << std::endl;
    std::cout << "Destination: " << destination << std::endl;

    return 0;
}

输出:

Source: Hello, World!
Destination: Hello, World!

注意:

  • destination 数组必须足够大,以容纳 source 字符串及其末尾的空字符 ('\0')。
  • 如果 destination 的空间不足,strcpy 不会进行检查,可能导致缓冲区溢出等问题。因此,程序员要手动确保内存安全。

(2)strncpy: 复制指定长度的字符串。

strncpycstring 中的一个函数,用于从源字符串复制指定长度的字符到目标字符串。与 strcpy 不同的是,strncpy 只会复制指定长度的字符,且如果源字符串的长度小于指定长度,则会在目标字符串中填充空字符 ('\0') 以确保长度一致。

char* strncpy(char* destination, const char* source, size_t num);
  • destination:目标字符数组,存放复制后的字符串。
  • source:源字符数组,被复制的字符串。
  • num:要复制的字符数。

示例代码:

#include <iostream>
#include <cstring>

int main() {
    // 创建源字符串
    const char source[] = "Hello, World!";
    
    // 创建目标数组,确保大小足够
    char destination[20];
    
    // 使用 strncpy 复制指定长度的字符串
    std::strncpy(destination, source, 5);
    
    // 手动添加空字符,以确保目标字符串正确结束
    destination[5] = '\0';
    
    // 输出结果
    std::cout << "Source: " << source << std::endl;
    std::cout << "Destination: " << destination << std::endl;

    return 0;
}

输出:

Source: Hello, World!
Destination: Hello

说明:

  • strncpy(destination, source, 5) 只复制源字符串的前 5 个字符 Hello 到目标数组。
  • 手动添加 destination[5] = '\0'; 是为了确保目标字符串以空字符结尾,否则在输出时可能会导致意外行为。
  • 如果 source 字符串的长度小于 num,则 strncpy 会在目标数组中补充空字符 (\0) 直到复制了 num 个字符。

注意:

  • strncpy 不会自动添加结尾的空字符 ('\0'),因此需要手动添加。
  • 如果源字符串的长度小于指定的字符数,目标字符串会用空字符填充。

(3)strcmp: 比较两个字符串。

strcmpcstring 中的一个函数,用于按字典序比较两个 C 风格字符串。它比较的是字符串的 ASCII 值,并返回一个整数,表示两个字符串的相对顺序。

  • str1str2:要比较的两个字符串。
  • 返回值:
    • 0:str1str2 相等。
    • 正值:str1 大于 str2
    • 负值:str1 小于 str2

示例代码:

#include <iostream>
#include <cstring>

int main() {
    // 定义两个字符串
    const char str1[] = "apple";
    const char str2[] = "banana";
    
    // 使用 strcmp 比较两个字符串
    int result = std::strcmp(str1, str2);
    
    // 输出比较结果
    if (result == 0) {
        std::cout << "str1 and str2 are equal." << std::endl;
    } else if (result > 0) {
        std::cout << "str1 is greater than str2." << std::endl;
    } else {
        std::cout << "str1 is less than str2." << std::endl;
    }

    return 0;
}

输出:

str1 is less than str2.

说明:

  • 在这个例子中,strcmp("apple", "banana") 返回一个负值,因为在字典序(基于 ASCII 值)中,a(ASCII 值为 97)比 b(ASCII 值为 98)小,因此 apple 小于 banana

strcmp 的返回值详解:

  • 如果 strcmp 返回 0,表示两个字符串相等。
  • 如果返回正值,表示 str1 在字典序中比 str2 大。
  • 如果返回负值,表示 str1 在字典序中比 str2 小。
举几个简单例子:
  • strcmp("apple", "apple") == 0:两个字符串相等。
  • strcmp("apple", "banana") < 0apple 小于 banana
  • strcmp("banana", "apple") > 0banana 大于 apple

(4)strlen: 获取字符串的长度。

strlencstring 中的一个函数,用于计算 C 风格字符串的长度(不包括结尾的空字符 '\0')。它返回的是字符串中字符的个数。

size_t strlen(const char* str);
  • str:要计算长度的字符串。
  • 返回值:字符串的长度(不包括终止的空字符 '\0')。

示例代码:

#include <iostream>
#include <cstring>

int main() {
    // 定义一个字符串
    const char str[] = "Hello, World!";
    
    // 使用 strlen 计算字符串长度
    size_t length = std::strlen(str);
    
    // 输出字符串长度
    std::cout << "The length of the string \"" << str << "\" is " << length << "." << std::endl;

    return 0;
}

输出:

The length of the string "Hello, World!" is 13.

说明:

  • 在这个例子中,strlen("Hello, World!") 返回 13,因为 "Hello, World!" 中有 13 个字符(不包括字符串末尾的空字符 '\0')。
  • strlen 函数遍历字符串直到遇到终止空字符 '\0',然后返回遍历的字符数。

重要注意事项:

  • strlen 计算的长度不包括字符串的结束符 '\0'
  • 如果传递给 strlen 的字符串没有以 '\0' 结尾(即不是合法的 C 风格字符串),它可能导致未定义行为,因为 strlen 函数会继续读取内存,直到找到 '\0'。因此,确保传递的字符串是正确终止的非常重要。

(5)strcat: 拼接字符串。

strcatcstring 中的一个函数,用于将一个 C 风格字符串追加到另一个 C 风格字符串的末尾。它会将源字符串的内容附加到目标字符串的末尾,包括结尾的空字符 '\0'

语法

char* strcat(char* destination, const char* source);
  • destination:目标字符数组,原有内容会被保留,源字符串会被追加到其末尾。
  • source:要追加的源字符串。
  • 返回值:返回目标字符串 destination 的指针。
#include <iostream>
#include <cstring>

int main() {
    // 定义目标字符串数组和源字符串
    char destination[50] = "Hello, ";
    const char source[] = "World!";
    
    // 使用 strcat 拼接字符串
    std::strcat(destination, source);
    
    // 输出结果
    std::cout << "Resulting string: " << destination << std::endl;

    return 0;
}

输出:

Resulting string: Hello, World!
  • 在这个例子中,strcat(destination, source)"World!" 追加到 "Hello, " 的末尾。
  • destination 字符数组在使用 strcat 之前已经分配了足够的空间来容纳拼接后的结果(这里是 50 个字符)。strcat 依赖于目标数组有足够的空间来存储拼接后的字符串,否则可能会导致缓冲区溢出。

注意事项:

  • 确保 destination 数组有足够的空间来存放原有内容加上追加的源字符串,以及结尾的空字符 '\0'
  • strcat 不会自动检查目标数组的大小,所以在使用 strcat 时必须手动确保目标数组足够大。否则,可能会导致内存溢出、数据损坏或其他未定义行为。

(6)strchr: 查找字符在字符串中的第一次出现位置。

strchrcstring 中的一个函数,用于在 C 风格字符串中查找指定字符第一次出现的位置。它返回一个指向找到的字符位置的指针。如果字符未找到,则返回 nullptr

语法

char* strchr(const char* str, int character);
  • str:要搜索的字符串。
  • character:要查找的字符,作为 int 类型传递,通常是 char 类型的值。
  • 返回值:返回一个指向找到的字符位置的指针;如果字符未找到,则返回 nullptr

示例代码:

#include <iostream>
#include <cstring>

int main() {
    // 定义一个字符串
    const char str[] = "Hello, World!";
    
    // 查找字符 'W' 在字符串中的第一次出现位置
    char* position = std::strchr(str, 'W');
    
    // 输出结果
    if (position != nullptr) {
        std::cout << "Character 'W' found at position: " << (position - str) << std::endl;
        std::cout << "Sub-string starting from 'W': " << position << std::endl;
    } else {
        std::cout << "Character 'W' not found." << std::endl;
    }

    return 0;
}

输出:

Character 'W' found at position: 7
Sub-string starting from 'W': World!

说明:

  • std::strchr(str, 'W') 查找字符 'W' 在字符串 "Hello, World!" 中的位置。函数返回一个指向字符 'W' 的位置的指针。
  • (position - str) 计算字符 'W' 在字符串中的位置,结果是 7(索引从 0 开始)。
  • position 指向 "World!",即从字符 'W' 开始的子字符串。

注意事项:

  • strchr 查找的是第一个匹配的字符,如果要查找所有匹配的字符,需要在找到匹配项后继续搜索。
  • 传递的字符 character 作为 int 类型,但通常以 char 类型的值传递,strchr 内部会处理这个值。

通过 #include <cstring>,你可以使用这些函数来处理 C 风格字符串。

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

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

相关文章

2025最新:如何打造公司财务管理系统?Java SpringBoot实现,一步到位管理企业财务!

✍✍计算机毕业编程指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java…

STM32F407VET6开发板RT-Thread的移植适配

前言 最近购买了一块 STM32F407VET6开发板【魔女】&#xff0c;http://www.stm32er.com/ 通过原理图了解到&#xff0c;开发板板载 CMSIS-DAP 调试下载口&#xff0c;例程部分大部分以裸机程序为主 目标&#xff1a;打算移植适配到 RT-Thread 适配 RT-Thread RT-Thread 支持…

基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现

文章目录 概要整体架构流程技术名词解释技术细节1. 数据结构2. 自适应计算队列大小3. 生产者拼接缓存4. 高效地通知消费者 小结1. 性能表现情况2. 主要改进3. 源码和发行版 概要 准静态自适应环形缓存器&#xff08;Quasi-Static Adaptive Ring Cache&#xff09;是taskBus用于…

【Python报错已解决】 No Python at ‘C:\Users...\Python Python39\python.exe’

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;检查Python安装路径2.2 …

苍穹外卖随记(一)

黑马苍穹外卖逻辑和细节的问题和解决 1.后端查询到员工的日期信息&#xff0c;将信息进行json化传给前端时发生&#xff1a;前端收到的是不标准的日期json串。 解决&#xff1a;1.注解进行json格式化&#xff08;JsonFormat&#xff09;2. 在spring MVC中&#xff0c;通过消息…

如何验证VMWare WorkStation的安装?

如何验证VMWare WorkStation的安装&#xff1f; 右击"网络"&#xff0c;点击 打开"网络和Internet设置"&#xff0c;点击更改适配器选项&#xff0c;如果出现VMNet1和VMNet8&#xff0c;则说明安装成功。

内网穿透(cpolar实现)

目录 一、介绍 二、内网穿透工具cpolar实现 1.下载与安装 2.cpolar指定authtoken 3.获取临时域名 4.验证临时域名有效性 一、介绍 内网穿透&#xff0c;即 NAT 穿透&#xff08;Network Address Translation Traversal&#xff09;&#xff0c;是一种网络技术&#xff0…

Python爬虫使用实例-wallpaper

1/ 排雷避坑 &#x1f95d; 中文乱码问题 print(requests.get(urlurl,headersheaders).text)出现中文乱码 原因分析&#xff1a; <meta charset"gbk" />解决方法&#xff1a; 法一&#xff1a; response requests.get(urlurl,headersheaders) response.en…

java基础-IO(4)管道流 PipedOutputStream、PipedInputStream、PipedReader、PipedWriter

管道 提到管道&#xff0c;第一印象就是水管或者地下管道&#xff0c;一节接着一节&#xff0c;形如下图。 管道流 "流"从上一个管道 ——-> 下一个管道。又细分为字节流和字符流。 字节流&#xff08;PipedOutputStream、PipedInputStream&#xff09; 如果…

SSM框架介绍

SSM通常指的是三个开源框架的组合&#xff0c;即Spring、SpringMVC&#xff08;Spring Web MVC&#xff09;和MyBatis&#xff0c;这三个框架经常一起使用来开发Java企业级应用&#xff0c;特别是在Web应用开发中非常流行。 SSM框架介绍 Spring 简介&#xff1a;Spring是一个…

谷粒商城のNginx

文章目录 前言一、Nginx1、安装Nginx2、相关配置2.1、配置host2.2、配置Nginx2.3、配置网关 前言 本篇重点介绍项目中的Nginx配置。 一、Nginx 1、安装Nginx 首先需要在本地虚拟机执行&#xff1a; mkdir -p /mydata/nginx/html /mydata/nginx/logs /mydata/nginx/conf在项目…

ModuleNotFoundError: No module named ‘mmcv.transforms‘

不得已的解决方法&#xff1a; mmcv升级到2.0.0即可解决 升级后自然又面临一系列不兼容问题&#xff01; 官方文档查漏补缺

【STM32】呼吸灯实现

对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999&#xff0c;重装载值为2000&#xff0c;因为设置内部时钟晶振频率为100MHZ &#xff0c;1s跳 100 000000次 &#xff0c;跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…

九,自定义转换器详细操作(附+详细源码解析)

九&#xff0c;自定义转换器详细操作&#xff08;附详细源码解析&#xff09; 文章目录 九&#xff0c;自定义转换器详细操作&#xff08;附详细源码解析&#xff09;1. 基本介绍2. 准备工作3. 自定义转换器操作4. 自定义转换器的注意事项和细节5. 总结&#xff1a;6. 最后&…

【前端学习】AntV G6-07 深入图形与图形分组、自定义节点、节点动画(上、中)

课程链接 AntV G6&#xff1a;深入图形与图形分组、自定义节点、节点动画&#xff08;上&#xff09;_哔哩哔哩_bilibili AntV G6&#xff1a;深入图形与图形分组、自定义节点、节点动画&#xff08;中&#xff09;_哔哩哔哩_bilibili 图形分组 Group | G6 (antgroup.com) 自…

ARM32开发——DMA内存到内存

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求数据交互流程开发流程依赖引入DMA初始DMA传输请求完整代码 关心的内容DMA初始化DMA初始化DMA数据传输请求完整代码 DMA中断开启…

封装智能指针 qt实现登录界面

1.封装独占智能指针——unique_ptr #include <iostream> #include <utility> // For std::move// 命名空间 namespace custom_memory { template <typename T> class myPtr { public:// 使用初始化列表进行初始化explicit myPtr(T* p nullptr) noexcept : …

卡西莫多的诗文集2022-2024.9月6-校庆国庆专版定版

通过网盘分享的文件&#xff1a;卡西莫多的诗文集2022-2024.9月6-A5-校庆国庆专版-定版.pdf 链接: https://pan.baidu.com/s/1cpFK5k1baGXbSGxY30GL_A?pwdjgnt 提取码: jgnt 卡西莫多的诗文集2022-2024.9月6-校庆国庆专版&#xff0c;又稍作修改并勘误了一些错字&#xff0c;…

AWQ量化(Activation-aware Weight Quantization)

论文&#xff1a; AWQ: Activation-aware Weight Quantization for On-Device LLM Compression and Acceleration 中文解读&#xff1a; 深入理解AWQ量化技术 - 知乎 (zhihu.com) 动机&#xff1a;端侧设备用LLM&#xff0c;为了减少显存占用量&#xff0c;所以要用INT4量化&am…

【Jupyter Notebook】汉化

1.打开:Anaconda Prompt 2.输入:"activate Zhui01"(注意&#xff1a;Zhui01是刚创建的环境名字) activate Zhui01 3.输入:"pip install jupyterlab-language-pack-zh-CN" pip install jupyterlab-language-pack-zh-CN 4.打开:Jupyter Notebook 5.点击&q…