仿写C语言string.h头文件检验字符串函数

目录
  • c语言string.h头文件字符串检验函数仿写
    • strlen字符串求长度
    • strcmp / strncmp字符串比较
  • strchr / strrchr 字符串中查找字符ch
    • 第一个出现的字符ch
    • 最后一个出现的字符ch
    • strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,没有为NULL(BF算法)
    • strcpy / strncpy字符串拷贝
    • strcat / strncat字符串的粘贴
    • strdup 字符串申请堆区空间存放字符串的副本
  • 总结

c语言string.h头文件字符串检验函数仿写

所需头文件:stdio.h ,stdlib.h, string.h

strlen字符串求长度

int strlen_my(const char* src_str)
{
 	if (NULL == src_str)
	{
		return -1;
	}
	const char* p = src_str;
	while (*p != '\0')
	{
		p++;
	}
	return p - &(src_str[0]);
}
//递归
int strlen_my2(const char* src_str)
{
	if (src_str == NULL)
		return -1;
	if (*src_str)
	{
		return strlen_my2(src_str + 1) + 1;
	}
	else
	{
		return 0;
	}
}
 int main()
{
	const char* p = "hello";
	printf("%d \n",strlen_my(p));
	return 0;
}

strcmp / strncmp字符串比较

int strcmp_my(const char* str_a, const char* str_b)
{
	while ((*str_a != '\0' || *str_b != '\0') && *str_a == *str_b )
	{
		str_a++;
		str_b++;
	}
 	return *str_a - *str_b > 0 ? 1 : (*str_a - * str_b < 0 ? -1 : 0);
}
int strcmp_my2(const char* str_a, const char* str_b)
{
	int sub = 0;
	while ((sub = *str_a - *str_b) == 0 && *str_a++ && *str_b++);	//先赋值,指针再++
 	return sub > 0 ? 1 : (sub < 0 ? -1 : 0);
}
 int strncmp_my(const char* str_a, const char* str_b, size_t front_len)
{
	while (--front_len && *str_a != '\0' && *str_b != '\0'
		&& *str_a == *str_b)
	{
		str_a++;
		str_b++;
	}
 	return *str_a - *str_b > 0 ? 1 : (*str_a - *str_b < 0 ? -1 : 0);
}
 int main()
{
	const char* p = "hella";
	const char* q = "hell";
	printf("%d \n", strncmp_my(p, q, 4));
	return 0;
}

strchr / strrchr 字符串中查找字符ch

第一个出现的字符ch

//strchr 返回字符串中第一个出现的字符ch
char* strchr_my(const char* src_str, char ch)
{
	if (src_str == NULL)
	{
		return NULL;
	}
 	while (*src_str != '\0' && *src_str != ch)
	{
		src_str++;
	}
 	return *src_str == '\0' ? NULL : src_str;
}
 int main()
{
	const char* p = "hello";
	p = strchr_my(p, 'e');
	if (p == NULL)
		return 0;
	printf("%c\n", *p);
}
 

最后一个出现的字符ch

//strrchr查找字符串中最后一个出现的字母ch
char* strrchr_my(const char* src_str, char ch)
{
	if (NULL == src_str) return NULL;
	const char* p = src_str + strlen(src_str) - 1;
 	while ((p - src_str) >= 0 && *p != ch)
	{
		p--;
	}
	if (p - src_str == -1)
	{
		return NULL;
	}
	return p;
}
 int main()
{
	const char* p = "hello";
	//p = strchr_my(p, 'q');
 	p = strrchr_my(p, 'l');
	if (p == NULL)
		return 0;
	printf("%c\n", *p);
}
 

strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,没有为NULL(BF算法)

char* strstr_my(const char* src_str, const char* des_str)
{
	if (NULL == src_str || NULL == des_str)
	{
		return NULL;
	}
 	int len_src = strlen(src_str);
	int len_des = strlen(des_str);
	int i = 0;	//src_str
	int j = 0;	//des_str
 	while (i < len_src && j < len_des)
	{
		if (src_str[i] == des_str[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 1;
			j = 0;
		}
	}
 	if (j == len_des)
	{
		return src_str + i - j;
	}
	return NULL;
}
 int main()
{
	const char* p = "hello";
	const char* q = "llo";
	const char* rt = strstr_my(p, q);
	if (rt != NULL)
	{
		printf("%s\n", rt);
		return 0;
	}
	return 0;
}

strcpy / strncpy字符串拷贝

char* strcpy_my(char* des_str, const char* src_str)
{
	if (des_str == NULL || src_str == NULL)
		return NULL;
	char* p = des_str;
	while (*src_str != '\0')
	{
		*p++ = *src_str++;
	}
	*p = '\0';
	return des_str;
}
 char* strncpy_my(char* des_str, const char* src_str, size_t len)
{
	if (des_str == NULL || src_str == NULL || len <= 0)
		return NULL;
	char* p = des_str;
	//源字符串实际长度
	int cur_len = strlen(src_str) <= len ? len : strlen(src_str);
 	while (cur_len--)
	{
		*p++ = *src_str++;
	}
	*p = '\0';
	return des_str;
}
 int main()
{
	const char* p = "hello";
	char q[10] = {0};
 	if (strncpy_my(q, p, 1) != NULL)
	{
		printf("%s\n", q);
	}
 	return 0;
}

strcat / strncat字符串的粘贴

char* strcat_my(char* des_str, const char* src_str)
{
	if (des_str == NULL || src_str == NULL)
		return NULL;
	int len_des = strlen(des_str);
	char* p = des_str + len_des;
 	while (*src_str != '\0')
	{
		*p++ = *src_str++;
	}
	return des_str;
}
 char* strncat_my(char* des_str, const char* src_str, size_t len)
{
	if (des_str == NULL || src_str == NULL || len < 0)
		return NULL;
	int len_des = strlen(des_str);
	char* p = des_str + len_des;

	while (len--)
	{
		*p++ = *src_str++;
	}
	return des_str;
}
 int main()
{
	char p[20] = "hello";
	const char* q = "world";
	printf("p = %s\n", p);
	printf("q = %s\n", q);
	if (strncat_my(p, q, 3) != NULL)
	{
		printf("p = %s\n", p);
	}
	printf("q = %s\n", q);
	return 0;
}

strdup 字符串申请堆区空间存放字符串的副本

char* strdup_my(const char* src_str)
{
	if (NULL == src_str)
		return NULL;
	char* newspace = (char*)malloc((strlen(src_str) + 1 ) * sizeof(char));
	if (newspace == NULL)
		return NULL;
	int i = 0;
	while (*src_str != '\0')
	{
		newspace[i++] = *src_str++;
	}
	newspace[i] = '\0';
	return newspace;
}
int main()
{
	const char* p = "hello";
	char* q = strdup_my(p);
	if (q != NULL)
	{
		printf("%s\n", q);
		free(q);
		q == NULL;
	}
	return 0;
}

总结

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

(0)

相关推荐

  • C语言 OutputDebugString与格式化输出函数OutputDebugPrintf案例详解

    OutputDebugString属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了.可以把调试信息输出到编译器的输出窗口,还可以用DbgView(本机或TCP远程)这样的工具查看,这样就可以脱离编译器了.   OutputDebugString 默认只能输入一个参数,不能像printf那样格式化输出,下面改造成类似printf函数的输出方式. #include <windows.h> #include <stdio.h> //#include

  • 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语言实现常用字符串库函数(推荐)

    目录 一.实现memcpy 二.memmove模拟实现 三.strlen的模拟实现 1.计数器方法: 2.递归方式: 3.利用指针实现: 四.strcpy的模拟实现 五.strcmp的模拟实现 六.strstr模拟实现 七.模拟实现strcat 一.实现memcpy 将src所指向的内容拷贝到dst所指向的位置,拷贝len个字节. memcpy是内存拷贝函数 memcpy在使用的时候不用考虑类型,以字节为单位进行拷贝 遇到"\0"的时候不会停下,所以拷贝字符串的时候最好还是用strcp

  • 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语言string函数的详解

    PS:本文包含了大部分strings函数的说明,并附带举例说明.本来想自己整理一下的,发现已经有前辈整理过了,就转了过来.修改了原文一些源码的问题,主要是用char *字义字符串的问题,导致程序运行时崩溃.另外自己重写了部分测试程序,使其更能满足自己测试的需要.不当之处,还请海涵.@函数原型:  char *strdup(const char *s) 函数功能:  字符串拷贝,目的空间由该函数分配  函数返回:  指向拷贝后的字符串指针 参数说明:  src-待拷贝的源字符串 所属文件:  <s

  • 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语言string.h头文件检验字符串函数

    目录 c语言string.h头文件字符串检验函数仿写 strlen字符串求长度 strcmp / strncmp字符串比较 strchr / strrchr 字符串中查找字符ch 第一个出现的字符ch 最后一个出现的字符ch strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,没有为NULL(BF算法) strcpy / strncpy字符串拷贝 strcat / strncat字符串的粘贴 strdup 字符串申请堆区空间存放字符串的副本 总结 c语言string

  • C/C++语言中的头文件汇总

    stdio.h就是指"standard input&output" 意思就是说标准输入输出头文件! 所以了,用到标准输入输出函数时,就要调用这个头文件 C/C++头文件 include <assert.h> //设定插入点 include <ctype.h> //字符处理 include <errno.h> //定义错误码 include <float.h> //浮点数处理 include <fstream.h> //

  • 盘点分析C语言中少见却强大的字符串函数

    目录 正片开始 字符串函数 strcpy strcat strcmp strstr strtok strerror 正片开始 字符串函数 首先神魔是字符串函数? 指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝,计算长度,字符查找等的函数. 功能:把src所指由NUL结束的字符串复制到dest所指的 数组 中. 返回指向dest结尾处字符 (NUL)的 指针 . 像之前我写到过的 strcpy,strcat,strcmp 这些函

  • 详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,char const *src)            必须保证dst字符的空间足以保存src字符,否则多余的字符仍然被复制,覆盖原先存储在数组后面的内存空间的数值,strcpy无法判断这个问题因为他无法判断字符数组的长度. #include <stdio.h> #include<string.h> int main() { char message

  • C语言中操作密码文件的一些函数总结

    C语言setpwent()函数:从头读取密码文件中的账号数据 头文件: #include <pwd.h> #include <sys/types.h> 定义函数: void setpwent(void); 函数说明:setpwent()用来将getpwent()的读写地址指回密码文件开头. 范例 #include <pwd.h> #include <sys/types.h> main() { struct passwd *user; int i; for(i

  • C语言编程入门之程序头文件的简要解析

    头文件是扩展名为.h的文件,其中包含C函数的声明和宏定义,也可以多个源文件之间共享.有两种类型的头文件:程序员编写的文件,和编译器中附带的文件. 要求使用头文件的程序,包括通过它,使用C语言预处理指令#include就像所看到的包含stdio.h头文件,它随着编译器自带. 包括一个头文件等于复制头文件的内容,但我们不这样做,因为这很容易出错,一个好主意是我们不复制头文件的内容,特别是包括多个程序的源文件. 在C或C++程序的简单做法是,我们把所有的常量,宏全系统全局变量和函数原型在头文件,其中包

  • VS2019中在源文件中如何使用自己写的头文件

    目录 前言 开始教程 建立一个头文件 建立头文件对应的.cpp文件 在其余源文件中使用 前言 一个完整的头文件应该分为:.h文件与.cpp文件 一般来说函数的声明,类(结构体)的定义都是放在.h头文件中,而函数的实现则是写在对应的.cpp文件中,什么个对应法呢,就是头文件文件名与.cpp文件名相同. 上述.cpp文件是c++的源文件,也可以是.cc语言的源文件. 在引用自己写的头文件时是 include " 自己的头文件名",而不是include< >该方法只能引用系统定义

  • 如何使用bindgen将C语言头文件转换为Rust接口代码

    目录 Rust语言调用C语言接口 Rust语言将字符串转换为整型 编写build.rs自动化编译外部模块 简单的C语言头文件 Rust语言调用C语言接口 嵌入式系统层及应用层的软件开发,离不开C语言.笔者希望使用一种高效.稳定的开发语言,在一定程度上替代C语言,从而提高开发效率.降低嵌入式软件的扩展.维护成本,同时缩小研发团队规模.Rust编程语言很好地满足了高效.稳定这两个要求.不过需要在一定程度解决Rust调用外部C语言模块的问题:Rust语言已提供了完善的解决方案,笔者希望通过本文做一个必

  • C语言中的各种文件读写方法小结

    前言     找工作的时候,曾经用C语言练习过一段时间的算法题目,也在几个还算出名的OJ平台有过还算靠谱的排名.之前以为C语言只限于练习一下算法,但是工作中的一个问题解决让我意识到C语言的用处还是非常广泛的.下面介绍一下,如果用C语言来操作文件保存一个字符串,和读取一个字符串.算法中往往都是printf来打印出结果,但是真实工作中往往通过文件来进行一些持久化的存储工作. C-File I/O     文件的I/O操作是每一门语言的重点,因此这里我先来介绍一下如何用C语言去进行文件的I/O操作.

  • C++中头文件与源文件的作用详解

    一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件-- .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 C++ 头文件,里面放的也是 C++ 的源代码. C++ 语言支持"分别编译"(separatecompilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的 .cpp 文件里..cpp 文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通

随机推荐