C/C++常见的字符串操作函数

2 字符串操作

​ 由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。'\n’就是换行的意思,并且是一个字符

2.1 char[]
2.1.1 字符串拼接

字符串拼接函数主要使用strcat

示例代码:

#include <stdio.h>
#include <string.h>int main() {char arr1[30] = "abc";//使用stract 必须让数组足够大char arr2[] = "def";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

实现一个自己的拼接:

#include <iostream>
#include <sstream>
#include <vector>std::string joinVector(const std::vector<double>& vec, const std::string& delimiter) {std::ostringstream oss;if (!vec.empty()) {// 将第一个元素添加到流中oss << vec[0];// 依次将后续元素添加到流中,每个元素前面加上分隔符for (size_t i = 1; i < vec.size(); ++i) {oss << delimiter << vec[i];}}return oss.str();
}int main() {std::vector<double> hqivals = {1.2, 3.4, 5.6, 7.8};std::string delimiter = ", ";std::string result = joinVector(hqivals, delimiter);std::cout << result << std::endl;return 0;
}
2.1.2 字符串比较/查找

strcmp/strcasecmp是最严格的比较方法要求位置和字符串长度都要比较,而strspn/strcspn 是按照严格的位置进行对比进行查找的,strpbrk则最为宽松是不需要按照位置比较

(1)strcmp/strcasecmp

strcasecmp和strcmp都是用于字符串比较的函数,区别主要在于对大小写的敏感度和返回值的含义

C 库函数 int strcmp(const char *str1, const char *str2)str1 所指向的字符串和 str2 所指向的字符串进行比较。

int strcmp(const char *str1, const char *str2)

两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。

#include <stdio.h>
#include <string.h>int main ()
{char str1[15];char str2[15];int ret;strcpy(str1, "abcdef");strcpy(str2, "ABCDEF");ret = strcmp(str1, str2);if(ret < 0){printf("str1 小于 str2");}else if(ret > 0) {printf("str1 大于 str2");}else {printf("str1 等于 str2");}return(0);
}

strcasecmp

函数是一个字符串比较函数,用于比较两个字符串是否相等,不区分大小写;如果s1和s2相等,则返回值为0。如果s1小于s2(按字典顺序,忽略大小写),则返回值为负数。如果s1大于s2(按字典顺序,忽略大小写),则返回值为正数。

示例代码:

#include <stdio.h>
#include <string.h>int main() {const char* str1 = "Hello, World!";const char* str2 = "hELLO, wORLD!";int result = strcasecmp(str1, str2);if (result == 0) {printf("The strings are equal (case-insensitive).\n");} else if (result < 0) {printf("String 1 is less than String 2 (case-insensitive).\n");} else {printf("String 1 is greater than String 2 (case-insensitive).\n");}return 0;
}

如果要比较前7个字符:

if (strncasecmp(m_url, "http://", 7) == 0)

(2)strspn/strcspn

这两个函数是一对反义的函数,表示从str从第一个字符串开始,后续有多少字符相同;如果第一个字符串在chatset中,strspn会有值,若第一个字符串不在在chatset中,strspn会等于0,strcspn会有值

strspn示例代码:

const char *str = "abc123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strspn(str, charset);
printf("%zu\n", length);
//输出为3
const char *str = "1bc123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strspn(str, charset);
printf("%zu\n", length);
//输出为0

strcspn示例代码:

const char *str = "a123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strcspn(str, charset);
printf("%zu\n", length);
//输出为0
const char *str = "1bc123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strcspn(str, charset);
printf("%zu\n", length);
//输出为1

(3)strpbrk

比较两个字符串是否有相同的字符,不包括’\0’

返回值:返回指向str1中第一个匹配的字符的指针,若查找失败,则返回NULL

示例代码:

#include <string.h>
#include <stdio.h> 
int main(void){char *str1 = "www.dotcpp.com";char *str2 = "cde"; char *ptr = strpbrk(str1, str2);if(ptr){printf("strpbrk found first character: %c\n", *ptr);}else{printf("strpbrk didn't find character in set\n");}return 0;
}
//result:strpbrk found first character: d
2.1.3 字符串拷贝

(1) stpcpy

Char * stpcpy(char* destination, const char *source)

特性:(1)源字符串必须以’\0’结束;

​ (2)会将源字符串必须’\0’拷贝到目标空间

​ (3)目标空间必须足够大

#include <stdio.h>
#include <string.h>int main() {char a[10] = "123";//数组,定义好了不能进行复制改变值stpcpy(a, "C++");//只能在内存上进行操作printf("%s\n", a);return 0;
}

(2) strpncpy

char * strncpy ( char * destination, const char * source, size_t num )

size_t 是无符号整数类型,从源复制的最大字符数,也就是说strncpy(sub,char+3,4) // 将char中从3开始的4个数字复制到sub中

/*  char 字符串切片截取 strncpy比较两个char*字符串是否相等,if(strcmp(recData,name) == 0)来判断
*/# include<iostream>
using namespace std;int main () {char str1[] = "To be or not to be";char str2[40];char str3[40];/* copy to sized buffer (overflow safe): */strncpy ( str2, str1, sizeof(str2) );/* partial copy (only 5 chars): */strncpy ( str3, str2, 5 );str3[5] = '\0';   /* null character manually added */puts (str1);puts (str2);puts (str3);cout << "-------" << endl;char dest[4] = {""};char src[] = {"123456789"};strncpy(dest, src, 3);puts(dest);cout << "-------" << endl;char dest1[4] = {""};char src1[] = {"123456789"};strncpy(dest1, src1 + 3, 3);dest[4] = '\0';              //n<sizeof(src)时,必须有这一句,不然输出出错puts(dest1);return 0;
}
2.1.4 字符串截取和分割

(1)strstr

根据字符串截取

#include <stdio.h>
#include <string.h>int main() {char* p1 = "abcdaa";char* p2 = "cda";char *ret = strstr(p1, p2);if( ret == NULL){printf("字符串不存在");} else{printf("%s\n", ret);//输出cdaaprintf("%s\n", p1);//输出abcdaa}return 0;
}

示例代码:

 
int main()
{int num; //你需要的值const char* s = "m_tMediaConfig.dbMinCivalueLimit = 6";const char* p = strstr(s, "=");if (p)  //找到等号{++p; //跳过等号num = atoi(p); //此时num将等于6}//.........return 0;
}

(2)strchr()和strrchr()

这两个函数也是截取函数,但是通过查找相同的字节,截取这个字节以及后面所有字节组成的字符串,strchr()是从前往后查找,strrchr()是从后往前查找;

示例代码:

#include <stdio.h>
#include <string.h>int main(int argc, const char* argv[])
{//container_test();int len;char str[] = "https://www.runoob.com";char ch = '.';char* ret1 = strrchr(str, ch);printf("%c 之后的字符串是: %s\n", ch, ret1); //输出.comchar* ret2 = strchr(str, ch);printf("%c 之前的字符串是: %s\n", ch, ret2);//输出.runoob.comreturn 0;
}

**(3)字符串分割 strtok **

C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。

char *strtok(char *str, const char *delim)

**用法:第一个参数不为NULL,函数将找到s tr中第一个标记,strtok函数将保存它在字符串的位置

​ 第一个参数为null,函数将在同一个字符串中被保存的位置开始,查找下一个标记;**

示例代码:

#include <stdio.h>
#include <string.h>int main() {char arr[] = "zpw@bitedu.tech";char* p = "@.";char buff[1024] = {0};stpcpy(buff, arr);//直接分割char* ret = NULL;for(ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p)){printf("%s\n", ret);}
//    char *ret = strtok(arr, p);
//    printf("%s\n", ret);
//    ret = strtok(NULL, p);
//    printf("%s\n", ret);
//    ret = strtok(NULL, p);
//    printf("%s\n", ret);return 0;
}
2.2 std::string
2.2.1 substr

这个函数类似于Python的切片操作,函数原型:

string substr(int pos = 0,int n ) const;
// 该函数功能为:返回从pos开始的n个字符组成的字符串,原字符串不被改变

示例代码:

# include <iostream>
# include <string>
using namespace std;int main()
{const string image_name = "0170.bmp";print(image_name.substr(0, 4));return 0;
}
2.2.2 length size, sizeof 和strlen

sizeof 和strlen这两个来自char语言,length 和size来自std::string

length(): 用来获取字符串的长度。例如:string str = “asdfghjkl”,str.length() = 9。

strlen() :Strlen 返回的是’\0’结束前字符的个数,也就是说必须有’\0’,不然返回随机数;注意函数的返回值是size_t,是无符号的;

size(): 在获取字符串长度时,size()函数与length()函数作用相同。除此之外,size()函数还可以获取vector类型的长度。

sizeof():sizeof()运算符用来求对象所占内存空间的大小。Sizeof 返回的是字符的个数,包括’\0’

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

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

相关文章

6.1 deeplabv3+的pth模型转换为rknn模型

和yolov5的pth模型转换为rknn模型类似&#xff0c;deeplabv3的pth模型转为rknn模型的步骤是&#xff1a; pth------>onnx-------->rknn 1.pth转为onnx 代码如下&#xff1a; #!/usr/bin/env python3 # -*- coding: utf-8 -*- # by [jackhanyuan](https://github.com/…

实现一个线程安全的单例模式

单例模式 单例模式能保证某个类在程序中只存在唯⼀⼀份实例,⽽不会创建出多个实例 某个类,在一个类,只应该创建出一个实例,使用单例模式,就可以对咱们的代码进行一个更严格的校验和检查 单例模式具体的实现⽅式有很多.最常⻅的是"饿汉"和"懒汉"两种单例…

Linux之定时任务01

简介 Linux定时任务是一种可执行的命令或者脚本,在特定的时间或者时间间隔下自动执行。通过在系统中预设一些需要执行的任务,可以让Linux定时任务自动执行并完成这些任务。定时任务可以用于自动备份、系统清理、监控、自动化维护等任务。 一、apache服务器监控 [rootlocalhost…

代码随想录算法训练营day27

题目&#xff1a;93.复原IP地址、78.子集、90.子集II 参考链接&#xff1a;代码随想录 93.复原IP地址 思路&#xff1a;本题的思路和上题切割回文串类似&#xff0c;也是先要写一个判断函数&#xff0c;然后一个个切割。对返回条件&#xff0c;如果路径长度已经为4&#xff…

DevEco Studio下载与安装(Windows)

下载地址&#xff1a; HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 安装时直接点击 next 即可。 运⾏已安装的DevEco Studio&#xff0c;⾸次使⽤&#xff0c;请选择Do not import settings&#xff0c;单击OK。 1.安装Node.js 如果本地有下载&#xff0c;可以…

前端JS 时间复杂度和空间复杂度

时间复杂度 BigO 算法的时间复杂度通常用大 O 符号表述&#xff0c;定义为 T(n) O(f(n)) 实际就是计算当一个一个问题量级&#xff08;n&#xff09;增加的时候&#xff0c;时间T增加的一个趋势 T(n)&#xff1a;时间的复杂度&#xff0c;也就相当于所消耗的时长 O&#xff1…

乐吾乐Web可视化RTSP播放

背景 乐吾乐致力于物联网和智能制造等场景的Web可视化平台和解决方案&#xff0c;其中摄像头播放必不可少。 当前国内摄像头都以RTSP协议为主&#xff0c;而HTML不能直接读取RTSP协议&#xff0c;因此需要一个转流服务。乐吾乐Web可视化播放RTSP也是如此&#xff1a; RTSP协…

ArcGIS专用语言:Arcade详细介绍(一)

Arcade语言是专为在ArcGIS中使用而设计的。是一种可移植、轻量级且安全的表达语言&#xff0c;用于在ArcGIS应用程序中创建自定义内容。 与其他表达式语言一样&#xff0c;它可以执行数学计算、设置文本格式和计算逻辑语句&#xff0c;还支持多语句表达式、变量和流控制语句。…

理解计算着色器中glsl语言的内置变量

概要 本文通过示例的方式&#xff0c;着重解释以下几个内置变量&#xff1a; gl_WorkGroupSizegl_NumWorkGroupsgl_LocalInvocationIDgl_WorkGroupIDgl_GlobalInvocationID 基本概念 局部工作组与工作项 一个3x2x1的局部工作组示例如下&#xff0c;每个小篮格子表示一个工作项…

Vulnhub靶机:basic_pentesting_1

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.4&#xff09; 靶机&#xff1a;basic_pentesting_1&#xff08;10.0.2.6&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/en…

密码学——基本概念

引言 在计算机和通信技术发达的现代社会,密码已经成为防止信息被篡改,盗取等方面不可或缺的技术。可应用于:本人身份认证,网上交易加密和认证。保证文件不被篡改的电子签名。电子邮件的加密等等领域。 密码学术语: 密码 cipher 基本词汇: 明文P(Plain text)= 没有经…

TCP缓存

TCP缓存是指TCP协议在数据传输过程中使用的一种机制&#xff0c;用于临时存储和管理数据包。它主要有三个作用&#xff1a;提高网络性能、保证数据的可靠性和实现流量控制。 首先&#xff0c;TCP缓存可以提高网络性能。当发送端发送数据时&#xff0c;TCP协议会将数据分割成若…

如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

VR危险环境模拟介绍|VR虚拟现实设备

VR危险环境模拟是指利用虚拟现实技术来模拟和展现各种危险环境&#xff0c;以便训练人员应对紧急情况、提高安全意识和应急反应能力。这种模拟可以涉及到工业、医疗、紧急救援等多个领域&#xff0c;旨在帮助人们在真实环境中面对危险时能够做出正确的应对和决策。 VR危险环境…

Linux alias命令(为复杂命令创建别名,其中命令可带选项或参数)

文章目录 Mastering the Linux alias Command&#xff08;精通Linux的alias命令&#xff09;1. Understanding the alias Command&#xff08;理解alias命令&#xff09;示例Ubuntu20.04 arm操作系统OpenEuler20.03 arm操作系统 2. Basic Usage of alias&#xff08;alias的基本…

AMEYA360:广和通5G智能模组SC171支持Android、Linux和Windows系统,拓宽智能物联网应用

世界移动通信大会2024期间&#xff0c;广和通宣布&#xff1a;5G智能模组SC171除支持Android操作系统外&#xff0c;还兼容Linux和Windows系统&#xff0c;帮助更多智能终端客户快速迭代产品&#xff0c;拓宽智能化应用覆盖范围。 广和通SC171系列基于高通QCM6490物联网解决方案…

基于Python3的数据结构与算法 - 07 归并排序

一、归并 引入 假设现在的列表分两段有序&#xff0c;如何将其合并成为一个有序列表。 这种操作成为一次归并。 归并的思路 分别对两个列表进行遍历&#xff0c;比较两个列表中的最小值&#xff0c;将更小的取出来。取出后一次进行上操作&#xff0c;直到其中一个列表中的元…

springboot+vue实现Minio文件存储

安装minio 首先点击进入MINIO官网&#xff0c;进行一个minio服务器的下载 下载好了之后在本地磁盘找一个文件夹&#xff0c;把下载的exe放入文件夹&#xff0c;再新建一个文件夹准备存放数据和文件 在当前目录cmd进入控制台&#xff0c;输入代码 minio.exe server data成功后…

内衣洗衣机什么牌子好又便宜?实力非凡机型深度测评

内衣裤这种小件的衣物紧密接触皮肤&#xff0c;更是接触特殊生理部位&#xff0c;所以&#xff0c;内衣裤对卫生标准有着特殊要求&#xff0c;现在很多人都是&#xff0c;把内衣裤放到家里的大型洗衣机和其他衣物混洗&#xff0c;你应该知道大型洗衣机由于长期清洗一些大件的衣…

【Linux】——期末复习题(十一)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…