字符串与相应函数(上)
字符串处理函数分类
- 求字符串长度:strlen
- 长度不受限制的字符串函数:strcpy,strcat,strcmp
- 长度受限制的字符串函数:strncpy,strncat,strncmp
- 字符串查找:strstr,strtok
- 错误信息报告:strerror
- 字符操作,内存操作函数:memcpy,memmove,memset,memcmp
strlen
这是一个用于计算字符串长度的函数,它从字符串的起始位置开始计数,直到遇到字符串结束符\0为止,然后返回计数器的值。这个函数不包括结束符\0在内

strlen函数的特点
- 字符串以‘\0’作为结束标志,strlen函数返回的是字符串中‘\0’前面出现的字符个数
strlen函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include <assert.h>
#include<string.h>int my_strlen1(const char* str)
{assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}//递归
int my_strlen2(const char* str)
{assert(str != NULL);if (*str != '\0')return 1 + my_strlen2(str + 1);elsereturn 0;
}//指针-指针
int my_strlen3(const char* str)
{const char* start = str;while (*str){str++;}return str - start;
}int main()
{char arr[] = "abcdef";int ret1 = my_strlen1(arr);int ret2 = my_strlen2(arr);int ret3 = my_strlen3(arr);printf("%d\n", ret1);printf("%d\n", ret2);printf("%d\n", ret3);return 0;
}
strlen函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr[] = "bdeuwbfuycgbei";int ret = strlen(arr);printf("%d", ret);return 0;
}
输出结果:

strcpy
这个函数用于将一个字符串复制到另一个字符串中,直到遇到源字符串的结束符\0为止。如果目标字符串已经有内容,会被源字符串覆盖

strcpy函数的特点
- 源字符串必须以 '\0' 结束
- 会将源字符串中的 '\0' 拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变
strcpy函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcpy(char* din, char* sou)
{char* ret = din;assert(din && sou);while ( *din++=*sou++ ){;}return ret;
}int main()
{char str1[20] = "hello ";char str2[] = "hehe";my_strcpy(str2, str1);printf("%s\n", str2);return 0;
}
输出结果:

strcpy函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>int main()
{char arr1[] = "hello";char arr2[] = "xixi";strcpy(arr1, arr2);printf("%s", arr1);return 0;
}
strcat
这个函数用于将一个字符串追加到另一个字符串的末尾,形成一个新的字符串。它会将源字符串的内容添加到目标字符串的后面,直到遇到源字符串的结束符\0为止

strcat函数的特点
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改
strcat函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>char* my_strcat(char* din, char* sou)
{assert(din && sou);char* ret = din;while (*din){din++;}while (*din++ = *sou++){;}return ret;
}int main()
{char arr1[] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
strcat函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main ()
{char key[] = "apple";char buffer[80];do {printf ("Guess my favorite fruit? ");fflush (stdout);scanf ("%79s",buffer);} while (strcmp (key,buffer) != 0);puts ("Correct answer!");return 0;
}#include<stdio.h>
#include<string.h>int main()
{char str[80];strcpy(str, "these ");strcat(str, "strings ");strcat(str, "are ");strcat(str, "concatenated.");puts(str);return 0;
}
输出结果:

strcmp
这个函数用于比较两个字符串。如果两个字符串相等,它返回0;如果第一个字符串小于第二个字符串,它返回负数;如果第一个字符串大于第二个字符串,它返回正数

strcmp函数的规定

strcmp函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#include<assert.h>int my_strcmp(const char* arr1, const char* arr2)
{assert(arr1 && arr2);while (*arr1 == *arr2){if (*arr1 == '\0')return 0;*arr1++;*arr2++;}return *arr1 - *arr2;
}int main()
{char arr1[] = "abc";char arr2[] = "abcde";int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}
strcmp函数的使用
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <string.h>int main()
{char key[] = "apple";char buffer[80];do {printf("Guess my favorite fruit? ");fflush(stdout);scanf("%79s", buffer);} while (strcmp(key, buffer) != 0);puts("Correct answer!");return 0;
}
输出结果:

strcpy,strcat,strcmp与strncpy,strncat,strncmp的区别
长度限制方面
strcpy、strcat、strcmp:属于长度不受限制的字符串函数,以'\0'作为操作结束标志。例如strcpy会将源字符串一直拷贝到'\0'才停止,strcat会将源字符串追加到目标字符串后直到源字符串的'\0',strcmp会比较两个字符串直到遇到'\0'。不过这也可能带来问题,如strcpy在目的空间不够时,由于拷贝到'\0'才停止,可能会导致越界访问,使函数变得不安全 。strncpy、strncat、strncmp:属于长度受限制的字符串函数,在函数调用时需要额外指定操作的字符数量,能避免因操作过长字符串而引发的安全问题



#define _CRT_SECURE_NO_WARNINGS 1
/* strncpy example */
#include <stdio.h>
#include <string.h>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);return 0;
}
输出结果:

其他两个相似
相关文章:
字符串与相应函数(上)
字符串处理函数分类 求字符串长度:strlen长度不受限制的字符串函数:strcpy,strcat,strcmp长度受限制的字符串函数:strncpy,strncat,strncmp字符串查找:strstr,strtok错误信息报告:strerror字符操作,内存操作函数&…...
Laravel源码进阶
Laravel源码进阶 版本 laravel5.8 生成服务容器 public index.php //compose必要操作 require __DIR__./../vendor/autoload.php; //容器文件 $app require_once __DIR__./../bootstrap/app.php;-bootstrap/app.php //初始化容器 构造函数中执行这个几个方法 //$this->…...
镜舟科技亮相 2025 中国移动云智算大会,展示数据湖仓一体创新方案
4月10-11日,2025 中国移动云智算大会在苏州金鸡湖国际会议中心成功举办。大会以“由云向智,共绘算网新生态”为主题,汇聚了众多行业领袖与技术专家,共同探讨了算力网络与人工智能的深度融合与未来发展趋势。 作为中国领先的企业级…...
2025蓝桥杯省赛C/C++研究生组游记
前言 至少半年没写算法题了,手生了不少,由于python写太多导致行末老是忘记打分号,printf老是忘记写f,for和if的括号也老是忘写,差点连&&和||都忘记了。 题目都是回忆版本,可能有不准确的地方。 …...
重读《人件》Peopleware -(6)Ⅰ管理人力资源Ⅴ-帕金森定律重探 Parkinson’s Law Revisited
1954年,英国作家C. Northcote Parkinson引入了一个概念:工作会膨胀以填满分配给它的时间,这个概念现在被熟知为帕金森定律。如果你不知道很少有管理者接受过任何管理培训的话,你可能会以为他们都参加过一个关于帕金森定律及其影响…...
Linux-内核驱动-led
登记设备号(后面可以动态分配) 自己定义内核函数 登记设备名字和功能 exit和init在内核启动自动执行 这样定义直接操作物理地址 ioctl 定义了设备文件的各种操作,并准备将其注册到内核中。 代码中声明了一个cdev结构体变量cdev,这…...
记录一次因ASM磁盘组空间不足,导致MAP进程无法启动
生产中 ADG 库出现告警,检查发现 map 进程异常: 检查 alter 日志,出现: ORA-19504:failed to create file "DATAC1/casarch/2_162186_1067953047.arc" ORA-17502:ksfdcre:4 Failed to create file ... ORA-15041:diskgroup "DATAC1" space exhausted OR…...
可能存在特殊情况,比如控制台显示有延迟、缓冲问题等影响了显示顺序。
从控制台输出看,正常逻辑应是先执行 System.out.println(" 未处理异常演示 "); 输出对应文本,再因 arr 为 null 访问 length 触发 NullPointerException 输出异常信息。可能存在特殊情况,比如控制台显示有延迟、缓冲问题等影响…...
使用DaemonSet部署集群守护进程集
使用DaemonSet部署集群守护进程集 文章目录 使用DaemonSet部署集群守护进程集[toc]一、使用DaemonSet部署日志收集守护进程集二、管理DaemonSet部署的集群守护进程集1.对DaemonSet执行滚动更新操作2.对DaemonSet执行回滚操作3.删除DaemonSet 一、使用DaemonSet部署日志收集守护…...
c++中继承方面的知识点
继承的概念及定义 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保 持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设计的层次结…...
PyTorch 学习笔记
环境:python3.8 PyTorch2.4.1cpu PyCharm 参考链接: 快速入门 — PyTorch 教程 2.6.0cu124 文档 PyTorch 文档 — PyTorch 2.4 文档 快速入门 导入库 import torch from torch import nn from torch.utils.data import DataLoader from torchvision …...
Spring AI 结构化输出详解
一、Spring AI 结构化输出的定义与核心概念 Spring AI 提供了一种强大的功能,允许开发者将大型语言模型(LLM)的输出从字符串转换为结构化格式,如 JSON、XML 或 Java 对象。这种结构化输出能力对于依赖可靠解析输出值的下游应用程…...
spring security oauth2.0的四种模式
OAuth 2.0 定义了 4 种授权模式(Grant Type),用于不同场景下的令牌获取。以下是每种模式的详细说明、适用场景和对比: 一、授权码模式(Authorization Code Grant) 适用场景 • Web 应用(有后端…...
从零开始的C++编程 2(类和对象下)
目录 1.构造函数初始化列表 2.类型转换 3.static成员 4.友元 5.内部类 6.匿名对象 1.构造函数初始化列表 ①之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化…...
Vue 项目中 package.json 文件的深度解析
Vue 项目中 package.json 文件的深度解析 在 Vue 项目中,package.json 文件是项目配置的核心,它管理着项目的依赖关系、脚本命令、版本信息等重要内容。正确理解和配置 package.json 文件,对于项目的开发、构建、测试和部署都至关重要。本文…...
将三维非平面点集拆分为平面面片的MATLAB实现
将三维非平面点集拆分为平面面片的MATLAB实现 要将三维空间中不在同一平面上的点集拆分为多个平面面片,可以采用以下几种方法: 1. 三角剖分法 (Delaunay Triangulation) 最简单的方法是将点集进行三角剖分,因为三个点总是共面的࿱…...
AI结合VBA提升EXCEL办公效率尝试
文章目录 前言一、开始VBA编程二、主要代码三、添加到所有EXCEL四、运行效果五、AI扩展 前言 EXCEL右击菜单添加一个选项,点击执行自己逻辑的功能。 然后让DeepSeek帮我把我的想法生成VBA代码 一、开始VBA编程 我的excel主菜单没有’开发工具‘ 选项,…...
基于单片机的电梯智能识别电动车阻车系统设计与实现
标题:基于单片机的电梯智能识别电动车阻车系统设计与实现 内容:1.摘要 随着电动车在日常生活中的普及,将电动车带入电梯带来的安全隐患日益凸显,如引发火灾等。本研究的目的是设计并实现一种基于单片机的电梯智能识别电动车阻车系统。方法上,…...
Python快速入门指南:从零开始掌握Python编程
文章目录 前言一、Python环境搭建🥏1.1 安装Python1.2 验证安装1.3 选择开发工具 二、Python基础语法📖2.1 第一个Python程序2.2 变量与数据类型2.3 基本运算 三、Python流程控制🌈3.1 条件语句3.2 循环结构 四、Python数据结构🎋…...
Java——数据类型与变量
文章目录 字面常量Java数据类型变量定义变量的方式整形变量长整型变量短整型变量字节型变量浮点型变量双精度浮点型单精度浮点型 字符型变量布尔型变量 类型转换自动类型转换(隐式)强制类型转换(显式) 类型提升byte与byte的运算 字…...
9. C++STL详解vector的使用以及模拟实现
文章目录 一、vector的使用介绍1.1 vector的定义1.2 vector iterator 的使用1.3 vector 增删查改二、vector 迭代器失效问题会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。指定位置元…...
C/C++调用Python程序代码实现混合编程笔记教程
0、引言 Python在基础开发、数据科学、人工智能、Web框架开发等领域具有广泛的支持工具和开发教程,极大的缩短了产品原型开发周期、降低了开发难度。 有许多的功能,通过C/C实现,非常的复杂并且不方便,但是Python可能就是几行代码…...
LeetCode hot 100—子集
题目 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2…...
Linux网络编程——数据链路层详解,以太网、MAC地址、MTU、ARP、DNS、NAT、代理服务器......
目录 一、前言 二、以太网 二、以太网帧格式 三、 MAC地址 四、MTU 1、数据链路层的数据分片 2、MTU对UDP协议的影响 3、MTU对TCP协议的影响 五、ARP协议 1、什么是ARP 2、ARP的作用 3、ARP协议的工作流程 4、ARP缓存表 5、ARP请求报文 6、中间人 六、DNS&…...
MySQL 5.7.30 Linux 二进制安装包详解及安装指南
MySQL 5.7.30 Linux 安装包详解 mysql-5.7.30-linux-glibc2.12-x86_64.tar 是 MySQL 服务器 5.7.30 版本的 Linux 二进制发行包。 mysql-5.7.30-linux-glibc2.12-x86_64.tar 安装包下载 链接:https://pan.quark.cn/s/2943cd209ca5 包信息 版本: MySQL 5.7.30 平…...
基于springboot+vue的秦皇岛旅游景点管理系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 用户登录 旅游路…...
Linux网络编程——TCP通信的四次挥手
一、前言 上篇文章讲到了TCP通信建立连接的“三次握手”的一些细节,本文再对TCP通信断开连接的“四次挥手”的过程做一些分析了解。 二、TCP断开连接的“四次挥手” 我们知道TCP在建立连接的时需要“三次握手”,三次握手完后就可以进行通信了。而在通…...
634SJBH苏州旅游网站
1 绪论 1.1 课题的提出、研究现状及研究意义 旅游业具有“无烟产业”和“永远的朝阳产业”的美称,它已经和石油业、汽车业并列为世界三大产业;根据WTTC的统计,它每年产出4.7万亿美金的收入,直接或间接地为2亿700万人提供了就业机…...
计算机视觉算法实现——SAM实例分割:原理、实现与应用全景
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 实例分割领域概述 实例分割(Instance Segmentation)是计算机视觉领域最具挑战性的任务之一,…...
基于SpringBoot的宠物健康咨询系统(源码+数据库+万字文档)
502基于SpringBoot的宠物健康咨询系统,系统包含三种角色:管理员、用户,顾问主要功能如下。 【用户功能】 1. 首页:查看系统主要信息和最新动态。 2. 公告:浏览系统发布的公告信息。 3. 顾问:浏览可提供咨询…...
