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

 更新时间:2021年09月26日 11:44:26   作者:HQK666999  
这篇文章主要介绍了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;
}
 

总结

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

相关文章

  • linux c 查找使用库的cflags与libs的方法详解

    linux c 查找使用库的cflags与libs的方法详解

    本篇文章是对在linux中使用c语言查找使用库的cflags与libs的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++小知识:用合适的工具来分析你的代码

    C++小知识:用合适的工具来分析你的代码

    今天小编就为大家分享一篇关于C++小知识:用合适的工具来分析你的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C++中关于[]静态数组和new分配的动态数组的区别分析

    C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下
    2014-08-08
  • C++ namespace案例详解

    C++ namespace案例详解

    这篇文章主要介绍了C++ namespace案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • FFmpeg实战之分离出PCM数据

    FFmpeg实战之分离出PCM数据

    PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准数字音频数据。本文将通过FFmpeg实现分离PCM数据,感兴趣的可以了解一下
    2023-02-02
  • C语言广播的使用详解

    C语言广播的使用详解

    顾名思义可以把自己的数据发送给在特定范围内的所有人;我们网络编程中的广播一般是通过特定的广播地址把自己的数据发送给局域网内当前在线的客户端
    2022-05-05
  • 用c语言实现《狼人杀》游戏发牌系统

    用c语言实现《狼人杀》游戏发牌系统

    大家好,本篇文章主要讲的是用c语言实现《狼人杀》游戏发牌系统,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C语言实现日期和时间处理的常用函数总结

    C语言实现日期和时间处理的常用函数总结

    在C语言中,时间和日期处理是一项非常基础的技能,也是开发实际应用程序时经常会用到的功能,本文为大家总结了C语言中一些常用的时间库函数,希望对大家有所帮助
    2023-06-06
  • C++解密Chrome80版本数据库的方法示例代码

    C++解密Chrome80版本数据库的方法示例代码

    这篇文章主要介绍了C++解密Chrome80版本数据库的方法示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 基于C语言实现图书管理信息系统设计

    基于C语言实现图书管理信息系统设计

    这篇文章主要为大家详细介绍了基于C语言实现图书管理信息系统设计与实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论