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

C/C++字符串函数

一、strlen——求字符串长度

strlen()函数是求字符串长度的函数,其头文件为#include<string.h>,如果是C++11以上的版本可以只包含#include<iostream>即可。主要是用于求字符数组的长度。当是字符串string类时,可以用字符串名.size()实现。

程序演示:

#include<stdio.h>
#include<string.h>
char ch[]={"abcde"};
int main(){printf("%d",strlen(ch));return 0;
}

最后输出为5


二、strcpy——字符串拷贝

在C和C++中,strcpy函数用于复制一个字符串到另一个字符串。它定义在#include<string.h>头文件中。这个函数接收两个参数:目标字符串的指针和源字符串的指针。它会将源字符串(包括终止的空字符 \0)复制到目标字符串,用于字符数组。当是字符串string类时,可以用字符串1=字符串2实现。

函数原型:

strcpy(char *str2,cosnt char *str1)

str2是拷贝完成的目标字符串,str1是被拷贝的字符串。

程序演示:

#include<stdio.h>
#include<string.h>
char str1[]={"abcde"};
char str2[]={"aaaaa"};
int main(){printf("原str2为: %s\n",str2);strcpy(str2,str1);printf("拷贝完的字符串为: %s",str2);return 0;
}

注意事项:

  • 使用strcpy时需要非常小心,因为它不会检查目标数组的大小,如果目标数组不够大,可能会导致缓冲区溢出,这是一个常见的安全问题。
  • 为了避免缓冲区溢出,可以使用strncpy函数,它允许指定最大复制的字符数。

三、strncpy——字符串拷贝(进阶)

strncpy函数用于将一个字符串复制到另一个字符串,同时允许你指定最大复制的字符数。这个函数定义在#include<string.h> 头文件中,它提供了比strcpy更多的安全性,因为它可以防止缓冲区溢出。

函数原型:

char *strncpy(char *dest, const char *src, size_t n);

多了一个size参数,意思是将src的前n位复制到dest字符串前n位中。

程序演示:

#include<stdio.h>
#include<string.h>
char str1[]={"abcde"};
char str2[]={"aaaaa"};
int main(){printf("原str2为: %s\n",str2);strncpy(str2,str1,3);printf("拷贝完的字符串为: %s",str2);return 0;
}


四、strcat——字符串拼接

在C和C++中,strcat函数用于将一个字符串连接到另一个字符串的末尾。它同样定义在#include<string.h>头文件中。strcat会将源字符串附加到目标字符串的末尾,并在连接后的字符串末尾添加一个空字符 \0 来确保它是一个有效的字符串。

函数原型:

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

dest: 目标字符串的指针。src: 要连接的源字符串。作用是将src字符串拼接到dest字符串后面。

程序演示:

#include<stdio.h>
#include<string.h>
char str1[]={"abcde"};
char str2[]={"aaaaa"};
int main(){printf("原str2为: %s\n",str2);strcat(str2,str1);printf("拷贝完的字符串为: %s",str2);return 0;
}

注意事项:

  • 使用strcat时,必须确保目标字符串dest有足够的空间来容纳源字符串src,包括源字符串末尾的空字符 \0。如果目标数组空间不足,将会导致缓冲区溢出。
  • 目标字符串dest必须以空字符 \0 结尾,因为strcat会从目标字符串的空字符位置开始复制源字符串。
  • 与strcpy一样,为了避免缓冲区溢出,开发者应该使用更安全的函数,如strncat,它允许指定最大可以复制的字符数。

五、strncat——字符串拼接(进阶)

strnact 函数用于将一个字符串追加到另一个字符串的末尾,同时限制追加的字符数量。这个函数定义在#include<string.h>头文件中。

函数原型:

char *strncat(char *dest, const char *src, size_t n);

多了一个size参数,意思是将src的前n位拼接到dest字符串后面。

程序演示:

#include<stdio.h>
#include<string.h>
char str1[]={"abcde"};
char str2[]={"aaaaa"};
int main(){printf("原str2为: %s\n",str2);strncat(str2,str1,3);printf("拷贝完的字符串为: %s",str2);return 0;
}


六、strcmp——字符串比较

strcmp函数用于比较两个字符串,并根据比较结果返回一个整数。这个函数定义在#include<string.h>头文件中。注意它们比较时会区分大小写的,根据ASCII码值的大小比较,用于字符数组。比较时,会先进行比较第一个,第一个相同再比较第二个,第二个相同比较第三个,知道找到不同的为止。

函数原型:

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

str1是第一个字符串,str2是第二个字符串。

返回值:

  • 如果str1小于str2,返回一个小于0的值。
  • 如果str1等于str2,返回0。
  • 如果str1大于str2,返回一个大于0的值。

程序演示:

#include<stdio.h>
#include<string.h>
char str1[]={"abcde"};
char str2[]={"ABCDE"};
int main(){int num=strcmp(str1,str2);if(num<0){printf("str1<str2");}else if(num>0){printf("str1>str2");}else{printf("str1=str2");}return 0;
}

最后输出str1>str2


七、strncmp——字符串比较(进阶)

strncmp函数用于将一个字符与另一个字符串进行比较,同时限制比较的字符数量。这个函数是头文件为#include<string.h>,比较方式与返回值跟strcmp一样。

函数原型:

int strncmp(const char *str1, const char *str2, size_t n);

与strcmp不同多了一个size参数,含义是str1的前n位与str2的前n位进行比较。

程序演示:

#include<stdio.h>
#include<string.h>
char str1[]={"abcde"};
char str2[]={"abCDE"};
int main(){int num=strncmp(str1,str2,3);if(num<0){printf("str1<str2");}else if(num>0){printf("str1>str2");}else{printf("str1=str2");}return 0;
}

最后输出str1>str2


八、strstr——查找字串 

strstr函数用于在一个字符串中查找第一次出现另一个子字符串的位置。如果找到了子字符串,它返回一个指向该位置的指针;如果没有找到,它返回NULL。它会从字符串的第一个位置向后搜索,针对于字符数组。

函数原型:

char *strstr(const char *haystack, const char *needle);

haystack为要搜索的字符串,needle是需要查找的字串。

返回值:

成功时,返回指向haystack中第一次出现needle的位置的指针。

如果没有找到needle,则返回NULL。

程序演示:

#include<stdio.h>
#include<string.h>
char str1[]={"abcde"};
char str2[]={"cde"};
int main(){char *s=strstr(str1,str2);printf("查找的字串为:%s\n",s);printf("下标为:%d",s-str1);return 0;
}


九、substr——字符串截取

C++ 标准库中的string类提供了一个substr方法来返回字符串的子串。C语言中没有内置的 substr函数,但可以通过使用strncpy等函数来实现类似的功能。

同类的字符串截取还有一种,子符串名.substring(开始下标,结束下标) ,返回被截取的字符串,左闭右开。

函数原型:

substr(star,len)

star为开始下标,len为截取长度

程序演示:

#include<iostream>
#include<cstring>
using namespace std;
string s="abcdef";
int main(){string s1=s.substr(2,3);cout<<"截取的字符串为:";cout<<s1<<endl;return 0;
}


十、tolower、toupper——字符串大小写转换

tolower和toupper是两个标准库函数,用于将单个字符转换为小写或大写。这两个函数定义在#include<ctype.h>头文件中(C语言)或 #include<cctype>头文件中(C++)。

函数原型:

int tolower(int c);//转换小写
int toupper(int c);//转换大写

程序演示: 

#include<iostream>
#include<cctype>
using namespace std;
int main(){printf("%d   %c\n",tolower('A'),tolower('A'));printf("%d   %c\n",toupper('a'),toupper('a'));return 0;
}

注意事项:

  • tolower和toupper函数只影响英文字母,其他字符保持不变。
  • 这些函数只转换ASCII字符集中的字母。对于扩展的ASCII或Unicode字符,它们的行为是未定义的。
  • 转换是单字符操作,如果要转换整个字符串,需要在循环中对每个字符调用这些函数。

使用tolower和toupper函数可以方便地进行大小写转换,特别是在需要不区分大小写的比较或处理用户输入时。


十一、c_str——字符串转换字符数组

在C++中,c_str()是string类的一个成员函数,它返回一个指向以空字符终止的字符数组的指针,该数组包含与string对象相同的序列。这个字符数组通常用于与那些需要C风格字符串(以null结尾的字符数组)的函数进行交互。

函数原型:

const char* std::string::c_str() const;

用法为字符串名.c_str(),会返回一个字符串的指针。该函数常用于跟strcpy函数一起使用,用于将转化来的字符串指针拷贝给一个新的字符数组。

程序演示:

#include <iostream>
#include <cstring>
using namespace std;
char cstr[10];
int main() {string str = "Hello, World!";strcpy(cstr,str.c_str());cout<<cstr<<endl;return 0;
}

最后会输出一个字符数组Hello, World!

注意事项:

  • c_str()返回的是const char*类型的指针,这意味着你不能修改通过c_str()获取的字符串内容。
  • 只要string对象存在,c_str()返回的指针就是有效的。如果string对象被销毁或修改(导致其内部缓冲区重新分配),那么之前通过c_str()获取的指针可能就会变得无效。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LVS (Linux virual server)
  • 【ARM】ARM Cortex 处理器详细讲解
  • Upload 上传图标不显示
  • 【C#】StringComparer
  • 智能电话机器人的优势与挑战
  • 在mac上通过 MySQL 安装包安装 MySQL 之后,终端执行 mysql 命令报错 command not found: mysql
  • Pytorch-张量的创建
  • 电脑装机-热插拔
  • P1012 [NOIP1998 提高组] 拼数
  • java基础学习笔记1
  • 50 mysql 的 “where 1 = 1“ 的优化处理
  • 开启智能能效管理:4G 智能计量控制插座的协议对接与私有化部署
  • 36、Python之面向对象:容器类协议与collections.abc
  • Android进阶之路 - app后台切回前台触发超时保护退出登录
  • Java Web —— 第四天(HTTP协议,Tomcat)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • angular学习第一篇-----环境搭建
  • Javascript Math对象和Date对象常用方法详解
  • linux安装openssl、swoole等扩展的具体步骤
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue全家桶实现一个Web App
  • Vue实战(四)登录/注册页的实现
  • 从输入URL到页面加载发生了什么
  • 聚类分析——Kmeans
  • 使用SAX解析XML
  • 自制字幕遮挡器
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ‌移动管家手机智能控制汽车系统
  • ![CDATA[ ]] 是什么东东
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • ### RabbitMQ五种工作模式:
  • ###STL(标准模板库)
  • #QT(QCharts绘制曲线)
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (02)Unity使用在线AI大模型(调用Python)
  • (04)odoo视图操作
  • (11)MATLAB PCA+SVM 人脸识别
  • (12)Linux 常见的三种进程状态
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (zhuan) 一些RL的文献(及笔记)
  • (差分)胡桃爱原石
  • (附源码)php投票系统 毕业设计 121500
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (新)网络工程师考点串讲与真题详解
  • (转)ObjectiveC 深浅拷贝学习
  • (转载)从 Java 代码到 Java 堆
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET C# 使用 iText 生成PDF
  • .net core 连接数据库,通过数据库生成Modell
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上