【带头学C++】----- 五、字符串操作函数 ---- 5.1 字符串操作函数

news2024/11/26 22:33:57

5.1字符串操作函数(以str开头的字符串处理函数默认遇到'\0'结束操作)

5.1.1 测量字符串的长度strlen()

strlen() 函数用于计算一个字符串的长度。

#include <string.h> //注意:该头文件必须包含

size_t strlen(const char *s);

// s指的是需要测量字符串的首地址

例:

char str[] = "Hello";
int length = strlen(str);  // length 等于 5

 

遇到  '\0' 表示字符串的结尾,计算长度不包含该标志符号

例如:

 

5.1.2 字符串拷贝函数strcpy

1.strcpy或者strcpy_s将指定的字符串复制到目地地址

#include <string.h>
char *strcpy(char *dest,Tconst char *src);
char *strncpy(char *dest,const char *src,size_t n);
dest:目的空间地址
src: 原字符串的首元素地址

这个比较常用,经常会在一些项目中使用到。

案例:

注意:此时我使用的qt5.13.2对这个函数进行了警告:warning: 'strcpy' is deprecated: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

        这个警告信息是由于strcpy()函数被标记为不安全的,并且在一些编译环境中被认为是不建议使用的。如果你希望消除这个警告,可以考虑使用更安全的函数strcpy_s(C++11引入)

此时就没有警告信息了

2.strncpy 将指定长度的字符串复制到目标字符串

strncpy 函数用于将指定长度的字符串复制到目标字符串中。它的原型如下:

char *strncpy(char *destination, const char *source, size_t num);
  • destination:目标字符串,即要将源字符串复制到的位置。
  • source:源字符串,即要被复制的字符串。
  • num:要复制的字符数的最大限制。

strncpy 函数会将 source 中的最多 num 个字符复制到 destination 中,并且添加一个 null 字符,以确保目标字符串以 null 结尾。如果 source 的长度小于 num,那么 destination 中剩余的位置会被填充为 null 字符。

这个函数可用于避免 strcpy 和 strcpy_s 中的潜在缓冲区溢出问题,因为它允许你指定要复制的最大字符数。

以下是一个使用 strncpy 函数的示例:

#include <cstring>

int main() {
    char source[] = "Hello, world!";
    char destination[20];

    strncpy(destination, source, 10);  // 将 source 中的最多 10 个字符复制到 destination 中
    destination[10] = '\0';  // 手动添加 null 字符,以确保字符串结束

    return 0;
}

在这个示例中,source 中的最多 10 个字符被复制到 destination 中。为了确保 destination 以 null 结尾,我们手动添加了 null 字符。

 5.1.3 字符串追加函数strcat

在C++中,字符串追加函数是strcat()。该函数用于将一个字符串追加到另一个字符串的末尾。以下是strcat()函数的基本用法:

#include <cstring>  // 包含头文件以使用strcat函数

char str1[20] = "Hello, ";
char str2[] = "world!";

strcat(str1, str2);

在这个例子中,str1是目标字符串,str2是我们想要追加到str1末尾的源字符串。strcat()函数将str2中的内容追加到str1的末尾,结果会保存在str1中。

需要注意的是,为了能够容纳目标字符串和源字符串的合并,目标字符串数组str1必须足够大。

另外,C++标准库中的string类也提供了更安全和方便的字符串操作方法,推荐在C++中使用string类来处理字符串。使用string类,字符串追加可以通过运算符+来完成,例如:

#include <string>

std::string str1 = "Hello, ";
std::string str2 = "world!";

std::string result = str1 + str2;

使用string类,我们可以直接使用+运算符将两个字符串合并,并将结果保存在新的string对象result中。这种方式更为直观和安全。

5.1.4 字符串比较strcmp

C++中,可以使用strcmp()函数来比较两个字符串。该函数用于按照字典顺序比较两个字符串,并返回一个整数值来表示比较的结果。

strcmp()函数的原型如下:

int strcmp(const char *str1, const char *str2);
int strncmp(const char *str1, const char *str2, size_t n);//根据n长度比较
  • str1:要比较的第一个字符串。
  • str2:要比较的第二个字符串。

函数返回值:

  • 如果str1小于str2,则返回一个负整数。
  • 如果str1等于str2,则返回0。
  • 如果str1大于str2,则返回一个正整数。

以下是strcmp()函数的一个简单示例:

#include <string>  // 包含头文件以使用strcmp函数

const char *str1 = "apple";
const char *str2 = "banana";
int result = strcmp(str1, str2);

if (result < 0) {
    // str1 小于 str2
} else if (result > 0) {
    // str1 大于 str2
} else {
    // str1 等于 str2
}

在这个示例中,strcmp()函数将比较str1str2的字典顺序,并将结果保存在result中。根据result的值,我们可以判断str1str2的大小关系。

需要注意的是,C++标准库中的string类也提供了比较字符串的方法,如果在C++中使用string类来表示字符串,可以通过<<=>>===!=等运算符来比较字符串,从而使比较更直观和易读。

 

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

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

相关文章

计算机二级Office真题解析 excel减免税,订单,成绩

第一题 1.将“Excel 减免税.xlsx”文件另存为 excel.xlsx&#xff0c;最后提交该文件&#xff08;1 分&#xff09;。 2.将“对应代码.xlsx”文件中的 sheet1 工作表插入到 excel.xlsx 中&#xff0c;工作 表名重命名为“代码”&#xff08;3 分&#xff09;。 3.在"序号&…

Rust 中的引用与借用

目录 1、引用与借用 1.1 可变引用 1.2 悬垂引用 1.3 引用的规则 2、slice 类型 2.1 字符串字面量其实就是一个slice 2.2 总结 1、引用与借用 在之前我们将String 类型的值返回给调用函数&#xff0c;这样会导致这个String会被移动到函数中&#xff0c;这样在原来的作用域…

2023年亚太杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 赛题思路算法介绍FP树表示法构建FP树实现代码 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#…

git 命令行回退版本

git 命令行回退版本 git 命令行回退版本命令: 1.切换到需要回退的分支 git checkout branch-v2.0.02.更新远程分支 git fetch3.找到需要回退版本的版本号git revert a6914da55ff40a09e67ac2426b86f1212e6580eb4.清除工作区缓存git clean -df5.强制提交git push -f

[Linux] dns域名解析服务

一、DNS 1.1 DNS简介 域名解析&#xff1a;&#xff08;英文&#xff1a;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。DNS使用udp53和tcp53…

互联网Java工程师面试题·微服务篇·第三弹

目录 34、什么是端到端微服务测试&#xff1f; 35、Container 在微服务中的用途是什么&#xff1f; 36、什么是微服务架构中的 DRY&#xff1f; 37、什么是消费者驱动的合同&#xff08;CDC&#xff09;&#xff1f; 38、Web&#xff0c;RESTful API 在微服务中的作用是什…

C++字典树算法:找出强数对的最大异或值 II

涉及知识点 数学 字典树 题目 给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件&#xff0c;则称其为 强数对 &#xff1a; |x - y| < min(x, y) 你需要从 nums 中选出两个整数&#xff0c;且满足&#xff1a;这两个整数可以形成一个强数对&…

Mybatis框架——mybatis是什么

第一&#xff0c;mybatis是一个持久层的框架&#xff0c;它支持自定义SQL&#xff0c;存储过程以及高级映射。 mybatis几乎代替了所有的JDBC代码以及设置参数和获取结果集的工作&#xff0c;可以通过简单的XML或者注解来配置和映射原始类型、接口和Java POJO&#xff08;Plain…

webgoat-Challenges

AdminLostpassword 这一题密码藏在logo图片里 请求GET /WebGoat/challenge/logo 搜索admin看到密码&#xff0c;使用账号admin和这个密码登录拿到flag Without password 题目要求&#xff1a;在不知道Larry的密码情况下登录 考虑使用SQL注入 密码输入 123 or 11 -- Admin p…

【数据结构——队列的实现(单链表)】

数据结构——队列的实现&#xff08;单链表&#xff09; 一.队列1.1队列的概念及结构 二.队列的实现2.1 头文件的实现——&#xff08;Queue.h&#xff09;2.2 源文件的实现—— &#xff08;Queue.c&#xff09;2.3 源文件的实现—— &#xff08;test.c&#xff09; 三.队列的…

20.1 platform 设备驱动

一、Linux 驱动的分离与分层 1. 驱动的分隔和分离 现在有三个平台&#xff0c;A、B 和 C&#xff0c;这三个平台都有 MPU6050 设备。编写最简单的驱动框架如下图&#xff1a; 每个平台下都有一个主机驱动和设备驱动&#xff0c;主机驱动是必要的&#xff0c;因为不同的平台 I2…

【算法】新的开始(Kruskal算法,虚拟源点)

题目 发展采矿业当然首先得有矿井&#xff0c;小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井&#xff0c;但他似乎忘记了考虑矿井供电问题。 为了保证电力的供应&#xff0c;小 FF 想到了两种办法&#xff1a; 在矿井 i 上建立一个发电站&#xff0c;费用…

【计算机网络笔记】IP子网划分与子网掩码

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

项目笔记记录

一、node下载版本报错&#xff1a;npm install --legacy-peer-deps 二、Scheduled: 任务自动化调度 Scheduled 标记要调度的方法的注解&#xff0c;必须指定 cron&#xff0c;fixedDelay或fixedRate属性之一 fixedDelay&#xff1a;固定延迟 延迟执行任务&#xff0c;任务在…

sqli-labs关卡17(基于post提交的单引号闭合的报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第十四关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不…

使用validator实现枚举类型校验

使用validator实现枚举类型校验 前言&#xff1a; 在前端调用后端接口传递参数的过程中&#xff0c;我们往往需要对前端传递过来的参数进行校验&#xff0c;比如说我们此时需要对用户的状态进行更新&#xff0c;而用户的状态只有正常和已删除&#xff0c;并且是在代码中通过枚…

20.有效的括号(LeetCode)

思路&#xff1a;用栈的后进先出的特性&#xff0c;来完成题目的要求 因为C有库&#xff0c;可以直接用&#xff0c;而C语言没有&#xff0c;所以我们直接把写好的栈拷贝上来用。 首先&#xff0c;完成框架的搭建 其次&#xff0c;再实现循环内的部分。1.左括号入栈 2.右括…

键盘接受一串字符到BUF为首地址的字节单元中,要求用下列方法分别编程,将它们以相反的次序显示在屏幕的下一行中

(1).按地址从尾向前依次显示。 (2)利用堆栈反向显示。 (3).利用交换的方法反序后&#xff0c;然后显示&#xff1a;即ai<——>aj

通过流量分析查看业务系统运行和访问情况

在当今数字化时代&#xff0c;应用程序的运行和访问情况对于企业和组织来说至关重要。无论是在线销售平台、移动应用还是企业内部系统&#xff0c;应用的性能和可用性直接影响着用户体验、业务流程以及组织效率。因此&#xff0c;对应用的运行和访问情况进行全面分析和评估&…

网络运维Day14

监控概述 监控的目的 报告系统运行状况每一部分必须同时监控内容包括吞吐量、反应时间、使用率等提前发现问题进行服务器性能调整前&#xff0c;知道调整什么找出系统的瓶颈在什么地方 监控的资源类别 公开数据 Web、FTP、SSH、数据库等应用服务TCP或UDP端口 私有数据 CPU、内…