解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)

2024-02-06 23:36

本文主要是介绍解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天也是去学习了一波字符串函数,想着也为了加深记忆,所以写一下这篇博客。既帮助了我也帮助了想学习字符串函数的各位。下面就开始今天的字符串函数的学习吧。

目录

strcpy与strncpy

 strcat与strncat

strcmpy

strstr


strcpy与strncpy

在 C 语言中, strcpy 函数用于将一个字符串复制到另一个字符串中,并返回目标字符串的指针。该函数的原型如下:
 
 

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


 
 
其中, dest 表示目标字符串的指针, src 表示源字符串的指针。 strcpy 函数会将源字符串的内容复制到目标字符串中,并在复制结束后返回目标字符串的指针。
 

以下是一个简单的 strcpy 函数的模拟实现:
 
 

#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
char* My_strcopy(char* dest,const char* src)
{                                                                                                                                                                                                                                                                                                                                                                                                                                                                           char* ret = dest;assert(dest != NULL);assert(src!=NULL);while(*dest++ = *src++);return ret;
}


 
 
在这个模拟实现中,我们首先检查目标字符串和源字符串是否为空指针,如果为空指针则返回空指针。然后,我们使用一个循环将源字符串的内容逐个复制到目标字符串中。最后,返回目标字符串的指针。
 
需要注意的是,这个模拟实现只适用于源字符串和目标字符串的长度较小的情况。在实际使用中,建议使用标准库中的 strcpy 函数,以确保代码的可移植性和正确性。                                                                                                                                                                                                                                                                                                                                                                                                           


这样可能又有人问那我不想全部复制过去,我只想赋值前n个字符串那怎么实现呢?其实在这个库函数也有人创造出来过了,它就是strncpy,它也就比strcpy多一个n。下面是其解析与模拟与解析:

strncpy 函数是 C 语言中的内置函数之一,相较于 strcpy 函数,它使用更加灵活,功能更加强大。strncpy 函数将字符串源的前  num  个字符复制到目标字符串中,返回目标字符串的指针。它的语法形式为:

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


 
需要注意的是, strncpy 函数在复制字符串时,不会在目标字符串的末尾添加空字符  '\0' ,除非源字符串的长度小于  num 。如果源字符串的长度大于等于  num ,则会将源字符串的前  num  个字符复制到目标字符串中。如果源字符串的长度小于  num ,则会将源字符串的所有字符复制到目标字符串中,并在目标字符串的末尾添加  num  减源字符串长度个空字符  '\0' 。
 
下面是一个简单的  strncpy  函数的模拟实现:
 
 

char* My_strncpy(char* dest, const char* src, int num)
{char* tmp = dest;while (num && (*dest++ = *src++))num--;if (num)while (num--)*dest++ = '\0';return tmp;
}
int main()
{int num = 0;char arr1[10] = { '\0' };char arr2[10] = { '\0' };printf("input?the?dest:>\n");gets(arr1);printf("input?the?scr:>\n");gets(arr2);printf("input?the?copy?num:>");scanf("%d", &num);char* ret = My_strncpy(arr1, arr2, num);printf("%s\n", ret);
}

 


 
在这个示例中,我们定义了一个  my_strncpy  函数来模拟  strncpy  函数的行为。在  my_strncpy  函数中,我们使用一个  while  循环来复制源字符串的字符到目标字符串中,直到复制的字符数达到  num  或者遇到源字符串的结束字符  '\0' 。然后,如果  num  不为零,我们使用另一个  while  循环将目标字符串的剩余部分填充为空字符  '\0' 。最后,我们返回目标字符串的指针。
 
在  main  函数中,我们定义了两个长度为10的字符数组  arr1  和  arr2 ,并使用  gets  函数获取用户输入的字符串。然后,我们使用  scanf  函数获取要复制的字符数,并调用  my_strncpy  函数将源字符串的前  num  个字符复制到目标字符串中。最后,我们使用  printf  函数输出复制后的目标字符串。
 


 strcat与strncat

strcat 函数和 strncat 函数都是 C 语言标准库中的字符串操作函数,用于字符串的拼接和拷贝,下面是对它们的解析与模拟实现:
 
1.  strcat 函数:
 
- 函数声明: char *strcat(char *strDestination, const char *strSource) 。
- 函数功能:将源字符串拼接到目标字符串的末尾,并返回拼接后的目标字符串的首地址。
- 注意事项:目标字符串的空间必须足够大,且以 \0 结尾,源字符串必须以 \0 结尾,拼接后的字符串末尾也会自动添加 \0 。

- 模拟实现:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char * my_strcat(char * dest, const char * src)
{assert(dest);assert(src);char * ret = dest;while (*dest)dest++;while (*dest++ = *src++);return ret;
}
int main()
{char a[20] = "abcd";char b[5] = "efgh";my_strcat(a, b);printf("%s\n", a);system("pause");return 0;
}


 

2.  strncat 函数:
 
- 函数声明: char *strncat(char *strDestination, const char *strSource, size_t count) 。
- 函数功能:将源字符串的前 count 个字符拼接到目标字符串的末尾,并返回拼接后的目标字符串的首地址。
- 注意事项:目标字符串的空间必须足够大,且以 \0 结尾,源字符串必须以 \0 结尾, count 表示需要拼接的字符个数,如果 count 大于源字符串的长度,则拼接有效字符后,在目标字符串末尾添加 \0 ;如果 count 小于源字符串的长度,则拼接有效字符后,在目标字符串末尾添加 \0 。

- 模拟实现:
 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src, size_t count)
{assert(dest);assert(src);char* ret = dest;while (*dest)dest++;while (count--){if (*src)*dest++ = *src++;elsebreak;}*dest = '\0';return ret;
}
int main()
{char a[20] = "abc";char b[5] = "efgh";my_strncat(a, b, 3);printf("%s\n", a);system("pause");return 0;
}

 


 
当然,上述代码只是一种模拟实现,真正的 strcat 和 strncat 函数会对参数进行更严格的检查,并处理各种边界情况,以确保程序的稳定性和安全性。


strcmpy

 strcmp 是一个用于比较字符串大小的函数,其函数原型为 

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

该函数会将两个字符串中的字符一个一个比较直到一方比另一方大或者小,若直到 '\0' 都相等则会返回0。注意其返回值:

第一个大于第二个 返回大于0的数字 
 第一个等于第二个 返回等于0的数字 
 第一个小于第二个 返回小于0的数字
 

以下是一个 strcmp 函数的模拟实现:

 
// 模拟实现 
int My_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return (*str1 - *str2);
}int main()
{int ret = 0;char str1[10] = "dijshdf";char str2[10] = "fuhdsud";ret=My_strcmp(str1, str2);printf("%d\n", ret);return 0;
}


代码解析:首先使用 const 对 str1 和 str2 进行修饰保护,并对 str1 与 str2 进行断言保护,然后使用循环并解引用 str1 和 str2 并判断其是否相等,如果相等则循环继续, str1++ 并且 str2++ 直到遇到 '\0' ,此时返回0;若发现 str1 与 str2 解引用后不相等则返回 *str1-*str2 。


strstr

 strstr 函数的作用是在一个字符串(str1)中查找另一个字符串(str2)的首次出现位置,并返回该位置的指针。其函数原型为

 char*strstr(char*str1, const char*str2)

 

以下是对该函数的解析与模拟实现:
 
1. 函数解析:
 
-  str1 :被查找的目标字符串。
-  str2 :要查找的子字符串。
- 返回值:若 str2 是 str1 的子串,则返回 str2 在 str1 中首次出现的地址;如果 str2 不是 str1 的子串,则返回 NULL 。

 

2. 模拟实现:
 
 
 该函数返回子串在目标串中第一次出现的地址 

char* My_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = str1;const char* s2 = str2;const char* p = str1;while (*p){s1 = p;s2 = str2;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)p;}p++;}return NULL;
}int main()
{char arr1[] = "hello橘子真甜~";char arr2[] = "hello橘子";char* ret = My_strstr(arr1, arr2);if (ret == NULL){printf("子串不存在\n");}else {printf("字串存在:%s\n", ret);}return 0;
}


 
在上述代码中,首先使用 const 对 str1 和 str2 进行修饰保护,并对 str1 与 str2 进行断言保护,然后使用循环并解引用 str1 和 str2 并判断其是否相等,如果相等则循环继续, str1++ 并且 str2++ 直到遇到 '\0' ,此时返回 p 的地址;若发现 str1 与 str2 解引用后不相等则返回 NULL 。
 

 


文章已到篇尾,请各位多多支持。

这篇关于解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/685888

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数