一篇文章教你用C语言模拟实现字符串函数
前言
编程过程中经常会使用到一些字符串函数,这些字符串函数都在C语言标准库中,我们可以直接使用。但我们也要了解一下它们是如何实现的。
模拟
1.strlen 函数
strlen函数是用来求字符串长度的。官方给出的解释如图
返回值类型是无符号整型,参数类型是char*,遇见\0停止。
strlen的模拟实现有三种方法,1、count计数。2、递归。3、指针减指针。
count计数
#include <stdio.h> int my_strlen(const char* str) { int count = 0; while (*str++) { count++; } return count; } int main() { char str[] = "abcdefg"; int len = my_strlen(str); printf("%d", len); return 0; }
递归
#include <stdio.h> int my_strlen( const char* str) { if (*str == '\0') { return 0; } else { return my_strlen(++str) + 1; } } int main() { char str[] = "abcdefg"; int len = my_strlen(str); printf("%d", len); return 0; }
指针减指针
#include <stdio.h> int my_strlen(const char* str) { char* p = str; while (*p) { p++; } return p - str; } int main() { char str[] = "abcdefg"; int len=my_strlen(str); printf("%d", len); return 0; }
2.strcpy 函数
strcpy函数是字符串拷贝函数。就是把源地址字符串拷贝到目的地址去。源地址字符串必须有\0。目的地址必须足够大。源地址字符串的\0也会拷贝过去,返回目的地址的地址。
官方解释如图
模拟实现
#include <stdio.h> char* my_strcpy(char* dest,const char* sour) { char* p=dest; while (*dest++ = *sour++) { ; } return p; } int main() { char sur[] = "abcdefg"; char dest[10] = { 0 }; printf("%s", my_strcpy(dest,sur)); return 0; }
3.strcat 函数
strcat函数是字符串追加函数。就是把源地址字符串追加到目的地址后边。要注意的是当遇见源地址的\0时停止,目的地址必须可修改,且足够大。strcat函数不能用于追加字符串自己,会越界,根本停不下来。
官方解释如图
模拟实现
#include <stdio.h> char* my_strcat(char* str2,const char* str1) { char* p = str2; while (*str2++){ ; } str2--; while (*str2++ = *str1++) { ; } return p; } int main() { char str1[] = "abcdefg"; char str2[20]="abc"; printf("%s", my_strcat(str2, str1)); return 0; }
4.strcmp函数
strcmp函数是字符串比较函数,如果str1比str2大就返回正值,str1比str2小返回负值。str1=str2比较下一对字符。只要有一个遇见\0就停止。
官方解释如图
模拟实现
#include <stdio.h> int my_strcmp( const char* str1,const char* str2) { while (*str1++-*str2++==0 && *str1!='\0' && str2!='\0') { ; } return *--str1 - *--str2; } int main() { char str1[] = "abcdefg"; char str2[] = "bbcdef"; int a=my_strcmp(str1,str2); printf("%d", a); return 0; }
5.strncpy函数
strncpy函数是长度受限制的字符串拷贝函数,可以指定拷贝多少给字节,当给定的字节数大于要拷贝的字符串时,不够的用\0补充。
官方解释
模拟实现
#include <stdio.h> char* my_strncpy(char* dest,const char* sour,int num) { char* p = dest; while (num--) { if (*sour != '\0') { *dest++ = *sour++; } else { *dest++ = '\0'; } } return p; } int main() { char sur[] = "abcdefg"; char dest[10] = { 0 }; printf("%s", my_strncpy(dest, sur,10)); return 0; }
6.strncat函数
strncat函数,需要注意的一点是,字符串追加完成后目的地址斜杠零是追加完后自己补充的。所以它可以实现自己给自己 追加。
官方解释
模拟实现
#include <stdio.h> char* my_strncat(char* str2,const char* str1,size_t num) { char* p = str2; while (*str2++){ ; } str2--; while (num--) { if (*str1 != '\0') { *str2++ = *str1++; } } *str2 = '\0'; return p; } int main() { char str1[] = "abcdefg"; char str2[20]="abc"; printf("%s", my_strncat(str2, str1,6)); return 0; }
7.strncmp函数
strncmp函数,比较字符串,和strcmp类似只是可以确定比较前几个字符。
官方解释
模拟实现
#include <stdio.h> int my_strncmp( const char* str1,const char* str2,size_t num){ while (num--&& *str1++-*str2++==0 && *str1!='\0'&& str2!='\0') { ; } return (*--str1 - *--str2); } int main() { char str1[] = "abcdefg"; char str2[] = "bbcdef"; int a=my_strncmp(str1,str2,5); printf("%d", a); return 0; }
8.strstr函数
strstr函数就是在一个字符串里找子字符串。
官方解释
模拟实现
#include <stdio.h> const char* my_strstr(const char* str1, const char* str2) { while (*str1) { const char* p1 = str1; const char* p2 = str2; while (*p1++ == *p2++) { ; } if (*--p2 == '\0') { break; } else { str1++; } } return str1; } int main() { char str1[] = "abbbcdefg"; char str2[] = "bcde"; int len = strlen(str2); const char* p = my_strstr(str1, str2); while (len--) { printf("%c", *p++); } return 0; }
9.strtok函数
strtok函数是字符串切割函数,用的比较少也比较难懂。用的是时候要给一个用做分隔符的字符集合。strtok函数找到分隔符后将其置为0.返回一个指向该标记的指针。如果第一个参数不为空则strtok找到第一个分隔符将其置零并记录该处地址,第二次调用strtok则传一个NULL则strtok会从前一个'\0‘处往后找下一个分隔符。
官方解释
模拟实现
#include <string.h> #include <stdio.h> char* my_strtok(char* str, char* demion) { static char* p_last = NULL; if (str == NULL && (str = p_last) == NULL) { return NULL; } char* s = str; char* t = NULL; while (*s != '\0') { t = demion; while (*t != '\0') { if (*s == *t) { p_last = s + 1; if (s - str == NULL) { str = p_last; break; } *s = '\0'; return str; } t++; } s++; } return NULL; } int main(void) { char str[] = "liusen,lin,lll"; char* result = NULL; result = my_strtok(str, ","); printf("%s\n", result); result = my_strtok(NULL, ","); printf("%s\n", result); return 0; }
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- 本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
- 这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04