C语言字符串函数模拟实现流程介绍

 更新时间:2022年09月15日 16:23:39   作者:烛九_阴  
字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数

该文章将简易模拟实现strlen、strcpy、strcat、strcmp、strstr。那么让我们废话少说,直接开始吧。

一、strlen

strlen-Get string length.即获取字符串长度。函数参数为 const char* str,函数返回类型为 size_t。如下图所示:

strlen函数的读取结束标志为’\0’,因此,若字符串中没有’\0’,字符串长度则为随机值。

下面将以三种方式模拟实现strlen函数,函数将命名为 my_strlen。

1.使用计数器

#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str);//断言一下传过来的参数是否为空指针
	size_t count = 0;//设置一个计数器
	while (*str++)
	{
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "hello world!";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

显示结果:

该方法为设置一个计数器变量 count,让计数器在指针每增加一个字节时自增一,当 *str 为’\0’时,循环结束,返回的count就是字符串长度。

2.使用函数递归

#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str);
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "hello world!";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

显示结果:

3.使用指针-指针

#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
	assert(str);
	const char* start = str;
	const char* end = str;
	while (*end != '\0')
	{
		end++;
	}
	return end - start;
}
int main()
{
	char arr[] = "hello world!";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	return 0;
}

显示结果:

二、strcpy

strcpy-Copy string.即拷贝字符串。函数参数为 char* dest 和 const char* scr,函数返回类型为 char*。如下图所示:

源字符串必须以’\0’结束,目标字符串会将’\0’一同拷贝

下面将模拟实现strcpy,函数命名为my_strcpy

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* scr)
{
	assert(dest);
	assert(scr);
	char* start = dest;//记录目标指针的起始位置
	while (*dest++ = *scr++)
	{
		;
	}
	return start;
}
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxxxxxxx";
	char arr2[] = "hello world!";
	printf("%s\n", my_strcpy(arr1, arr2));
	return 0;
}

显示结果:

三、strcat

strcat-Concatenate strings.即连接字符串。函数参数为 char* dest 和 const char* scr,函数返回类型为 char*。如下图所示:

源字符串必须以’\0’结束,否则程序将崩溃。

下面将模拟实现strcat,函数命名为my_strcat

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* scr)
{
	assert(dest);
	assert(scr);
	char* start = dest;
	while (*dest != '\0')
	{
		dest++;//先将目标指针遍历到'\0'的位置上
	}
	while (*dest++ = *scr++)
	{
		;
	}
	return start;
}
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world!";
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

显示结果:

四、strcmp

strcmp-Concatenate strings.即比较两个字符串。函数参数为 const char* str1 和 const char* str2,函数返回类型为 int。如下图所示:

标准规定:

1. str1>str2,返回值>0

2. str1==str2,返回值=0

3. str1<str2,返回值<0

下面将模拟实现strcmp,函数命名为my_strcmp

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)
	{
		if (*str1 != '\0')//两个字符串对应元素相等并都不为'\0'时,遍历这个字符串
		{
			str1++;
			str2++;
		}
		else
			return 0;//此为直到两个字符串结束都相等,所以返回0
	}
	return *str1 - *str2;//不相等时返回两个字符串对应元素的差值即可判断大小。
}
int main()
{
	char arr1[] = "abc";
	char arr2[] = "abcd";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf("arr1>arr2\n");
	}
	else if (ret < 0)
	{
		printf("arr1<arr2\n");
	}
	else
		printf("arr1==arr2\n");
	return 0;
}

显示结果:

到此这篇关于C语言字符串函数模拟实现流程介绍的文章就介绍到这了,更多相关C语言字符串函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • opencv3/C++基于颜色的目标跟踪方式

    opencv3/C++基于颜色的目标跟踪方式

    今天小编就为大家分享一篇opencv3/C++基于颜色的目标跟踪方式,具有很好的参考价值,希望对的有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C++快速排序及优化方案详解

    C++快速排序及优化方案详解

    这篇文章主要介绍了C++快速排序及优化方案详解,快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,需要的朋友可以参考下
    2023-10-10
  • c++中虚函数的实现详解

    c++中虚函数的实现详解

    众所周知探索c++对象内部的实现是一件非常有趣的事情,虚函数在c++中的实现机制就是用虚表和虚指针,但是具体是怎样的呢?下面这篇文章就来给大家实际检验一下 Visual Studio 2013 编译器在无优化条件下,虚函数的实现。有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • C语言链表实现工资管理系统

    C语言链表实现工资管理系统

    这篇文章主要为大家详细介绍了C语言链表实现工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++超详细探究new/delete的使用

    C++超详细探究new/delete的使用

    这篇文章主要介绍了C++中new与deleted关键字的使用,new在动态内存中为对象分配空间并返回一个指向该对象的指针;delete接受一个动态对象的指针, 销毁该对象, 并释放与之关联的内存
    2022-07-07
  • c++读取和写入TXT文件的整理方法

    c++读取和写入TXT文件的整理方法

    今天小编就为大家分享一篇c++读取和写入TXT文件的整理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 基于QT实现显示OpenCV读取的图片

    基于QT实现显示OpenCV读取的图片

    OpenCV自带了一部分常用的GUI功能,但是更多的图像处理功能需要其他GUI框架来辅助实现,本文将通过QT来显示OpenCV读取的图片,需要的可以参考一下
    2022-11-11
  • VSCode远程开发调试服务器c/c++代码

    VSCode远程开发调试服务器c/c++代码

    语音相关的好多项目要在linux上跑,但代码开发大多是在PC机上,本篇简单介绍一下怎么在个人电脑上用VSCode远程开发调试服务器上的c/c++代码。感兴趣的朋友跟随小编一起看看吧
    2020-04-04
  • C语言中lseek()函数和fseek()函数的使用详解

    C语言中lseek()函数和fseek()函数的使用详解

    这篇文章主要介绍了C语言中lseek()函数和fseek()函数的使用详解,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C++ Boost MPI接口详细讲解

    C++ Boost MPI接口详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11

最新评论