一篇文章教你用C语言模拟实现字符串函数

目录
  • 前言
  • 模拟
    • 1.strlen 函数
  • 2.strcpy 函数
  • 3.strcat 函数
  • 4.strcmp函数
  • 5.strncpy函数
  • 6.strncat函数
  • 7.strncmp函数
  • 8.strstr函数
  • 9.strtok函数
  • 总结

前言

编程过程中经常会使用到一些字符串函数,这些字符串函数都在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;
}
 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • c语言重要的字符串与内存函数

    目录 一.字符串函数 1. 求字符串长度的strlen 2.比较字符串大小的strcmp 3.复制字符串的strcpy 4.追加字符串的strcat 5.查找字符串函数的strstr 二.内存函数 1.复制 memcpy,memmove 2.比较 memcmp 一.字符串函数 1. 求字符串长度的strlen size_t strlen ( const char * str ); 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0'

  • C语言的字符串函数,内存函数笔记详解

    目录 strlen strlen模拟实现 strcpy strcpy的模拟实现 strcat strcat的模拟实现 strcmp strcmp模拟实现 strstr strstr模拟实现 strncpy strncat strncmp strtok memcpy memcpy模拟实现 memmove memmove模拟实现 memcmp 字符分类函数 字符串换函数 总结 strlen 此函数接收一个char*类型参数,返回字符串\0前字符数,注意返回类型是size_t型的 //关于strlen

  • 一篇文章带你了解C语言的一些重要字符串与内存函数

    目录 一.字符串函数 1. 求字符串长度的strlen 2.比较字符串大小的strcmp 3.复制字符串的strcpy 4.追加字符串的strcat 5.查找字符串函数的strstr 二.内存函数 1.复制 memcpy,memmove 2.比较 memcmp 总结 一.字符串函数 1. 求字符串长度的strlen size_t strlen ( const char * str ); 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '

  • C语言字符函数与字符串函数详解

    目录 本章重点 前言 1.strlen函数 注意点1 注意点2 2.strcpy 注意点1: 注意点2: 注意点3: 注意点4: 总结 本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 1.求字符串长度 strlen 2.长度不受限制的字符串函数 strcpy ,strcat, strcmp 3.长度受限制的字符串函数 strncpy,strncat ,strncmp 4.字符串查找 strstr,strtok 5.错误信息报告 strerror 6.字符操作 7.内存操作函数 mem

  • C语言字符串函数介绍与模拟实现详解

    目录 2. strcpy(复制字符串) 2.1 strncpy函数 2.2 模拟实现strcpy 3. strcat (追加字符) 3.1 strncat 函数 3.2 模拟实现strcat 4. strcmp(比较两个字符串内容) 4.1 strncmp函数 4.2 模拟实现strcmp 5. strstr (返回str1出现在str2位置处第一次的指针) 5.1 模拟实现strstr 6. strtok(分割字符串) 总结 1. strlen(求字符串长度) 这个函数就是求一个字符串的长度.

  • 一篇文章教你用C语言模拟实现字符串函数

    目录 前言 模拟 1.strlen 函数 2.strcpy 函数 3.strcat 函数 4.strcmp函数 5.strncpy函数 6.strncat函数 7.strncmp函数 8.strstr函数 9.strtok函数 总结 前言 编程过程中经常会使用到一些字符串函数,这些字符串函数都在C语言标准库中,我们可以直接使用.但我们也要了解一下它们是如何实现的. 模拟 1.strlen 函数 strlen函数是用来求字符串长度的.官方给出的解释如图 返回值类型是无符号整型,参数类型是char*

  • 一篇文章教你使用SpringBoot如何实现定时任务

    前言 在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务的实现方式. 一.第一种方式:@Scheduled 使用 @Scheduled

  • 一篇文章教你学会js实现弹幕效果

    目录 新建一个html文件: 建好html文件,搞出初始模版 HTML添加 CSS填充 js逻辑代码 动画效果 下面是弹幕效果 : 相信小伙伴们都看过了,那么它实现的原理是什么呢,那么我们前端怎么用我们web技术去实现呢?? 新建一个html文件: 哈哈哈,大家别像我一样用中文命名. 中文命名是不合规范的,行走江湖,大佬们看见你的中文命名会笑话你的. 上图中,我们引入了jquery插件,没错我们用jq写,回归原始(找不到cdn链接的小伙伴可以百度bootcdn,在里面搜索jquery).并且取了

  • 一篇文章教你学会使用Python绘制甘特图

    目录 优点 局限 一日一书 用来制作甘特图的专业工具也不少,常见的有:Microsoft Office Project.GanttProject.WARCHART XGantt.jQuery.Gantt.Excel等,网络上也有一些优质工具支持在线绘制甘特图. 可是这种现成的工具,往往也存在一些弊端,让编程人员不知所措.比如说,花里胡哨的UI,让人目不暇接,不知点哪个才好: 比如说,有些基于浏览器的图表需要掌握HTML.JS等编程语言,只会点Python的我直接被劝退: 再比如,进来就是注册.登

  • C语言模拟实现atoi函数的实例详解

    C语言模拟实现atoi函数的实例详解 atoi函数,主要功能是将一个字符串转变为整数,例如将"12345"–>12345.但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方. 1.指针为NULL 2.字符串为空字符串 3.空白字符 4.正号与负号问题 5.溢出问题 6.异常字符处理 接下来看代码:(具体几种问题处理都在代码的注释中说明) #define _CRT_SECURE_NO_WARNINGS 1 #include

  • C语言 模拟实现strlen函数详解

    目录 前言 一.strlen函数的介绍 1.strlen函数的声明 2.strlen函数的简单运用 3.注意事项 二.三种实现strlen函数的方法 1.计数器的方法 2.递归方法 3.指针-指针的方法 前言 用C语言模拟实现strlen函数,我这里有三种方法,快来看看跟你用的方法是否是一样. 一.strlen函数的介绍 1.strlen函数的声明 size_t strlen ( const char * str ): 这里函数的返回值为无符号整形(size_t),传入的是一个常量char*类型

  • C语言模拟实现strstr函数的示例代码

    目录 strstr函数介绍 BF算法介绍 BF算法模拟实现strstr函数 KMP算法介绍 KMP算法模拟实现strstr函数 strstr函数介绍 C语言提供了字符串匹配函数 strstr 函数,请看文档简介. 这个函数是用来匹配 str2 是否包含在 str1 字符串中,如果匹配成功,则返回指向str1中第一个出现的str2的指针,如果str2不是str1的一部分,则返回空指针.我们不妨举例说明,请看下面代码,调用 strstr 函数需要引入string.h头文件,我们发现,s1字符串中可以

  • 一篇文章带你实现C语言中常用库函数的模拟

    目录 前言 函数介绍 strlen(求字符串长度) strcpy(字符串拷贝) strcat(字符串追加) strcmp(字符串比较) strstr(找子字符串) memcpy(内存拷贝) memmove(内存移动) 总结 前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中. 字符串常量适用于那些对它不做修改的字符串函数. 函数介绍 strlen(求字符串长度) size_t strlen ( const char * str

  • 一篇文章带你了解C语言--数据的储存

    目录 前言 数据类型介绍 类型的基本归类 整形在内存中的存储 原码.反码.补码 大小端介绍 浮点型在内存中的存储 前言 前面我们学习了C语言的一些基本知识和基础的语法,想必大家对C语言都有了自己的认识. 当然只是学习这些知识还是不够的,我们需要进行更加深入的学习. 从本章开始,我们将进行C语言进阶阶段的学习,所以难度会有所增加. 数据类型介绍 前面我们已经学习了基本的内置类型: char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更

随机推荐