首页 > 其他分享 >手打C库头文件<string.h>

手打C库头文件<string.h>

时间:2024-10-05 12:34:03浏览次数:8  
标签:char gt const dest str1 ret 手打 lt st2

我是标题党,其实是只实现了部分函数

本人实力不济,不会讲解(绝对不是我懒)

只能直接贴上代码:

/*
未经测试,准确率无法保证(如有错误,欢迎指出) 
其中 strcoll(), strerror(), strxfrm() 无法实现 

*/ 
#if !defined My_cstring && !defined _INC_STRING
#define My_cstring
#define _INC_STRING

#ifndef size_t 
#ifdef _WIN64
	typedef unsigned long long size_t;
#else
	typedef unsigned int size_t;
#endif
#endif

#ifdef __cplusplus //判断一下是不是C++,是的话用C语言编译
extern "C"
{
#endif 

//声明 
void *memchr(const void *str,int c,size_t n);
//在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置
int memcmp(const void *str1, const void *str2, size_t n);
// 把 str1 和 str2 的前 n 个字节进行比较
void *memcpy(void *dest, const void *src, size_t n);
//从 src 复制 n 个字符到 dest 
void *memmove(void *dest, const void *src, size_t n);
//从 src 复制 n 个字符到 dest (更安全)
void *memset(void *str, int c, size_t n);
//将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中
char *strcat(char *dest, const char *src);
//把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
char *strncat(char *dest, const char *src, size_t n);
//把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止
char *strchr(const char *str, int c);
//在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置
int strcmp(const char *str1, const char *str2);
//把 str1 所指向的字符串和 str2 所指向的字符串进行比较
int strncmp(const char *str1, const char *str2, size_t n);
//把 str1 和 str2 进行比较,最多比较前 n 个字节
int strcoll(const char *str1, const char *str2);
//把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置
char *strcpy(char *dest, const char *src);
//把 src 所指向的字符串复制到 dest
char *strncpy(char *dest, const char *src, size_t n);
//把 src 所指向的字符串复制到 dest,最多复制 n 个字符
size_t strcspn(const char *str1, const char *str2);
//检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符
char *strerror(int errnum);
//从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针
size_t strlen(const char *str);
//计算字符串 str 的长度,直到空结束字符,但不包括空结束字符
char *strpbrk(const char *str1, const char *str2);
//检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置
char *strrchr(const char *str, int c);
//在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置
size_t strspn(const char *str1, const char *str2);
//检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。
char *strstr(const char *haystack, const char *needle);
//在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置
char *strtok(char *str, const char *delim);
//分解字符串 str 为一组字符串,delim 为分隔符
size_t strxfrm(char *dest, const char *src, size_t n);
//根据程序当前的区域选项中的 LC_COLLATE 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中 



//实现
size_t strlen(const char *str)
{
	char *ret=str;
	while(ret!='\0') ret++;
	return ret-str;
}

void *memchr(const void *str,int c,size_t n)
{
	void *ret=str;
	while(n&&(*(unsigned char *)ret != (unsigned char)c) ) ret=(unsigned char *)ret+1,n--;
	if(!n) return NULL;
	return (void *)ret;
}

int memcmp(const void *str1, const void *str2, size_t n)
{
	void *st1=str1,*st2=str2;
	whiel(n&&(*(char *)st1 != (char *)st2) ) st1=(char *)st1+1,st2=(char *)st2+1,n--;
	if(n==0) return 0;
	else return *(char *)st1 - *(char *)st2;
//	if(*(char *)st1 < *(char *)st2) return -1;
//	else return 1;
}

void *memcpy(void *dest, const void *src, size_t n)
{
	void *sr=src,*ret=dest;
	while(n--) *(char *)dest=*(char *)sr,dest=(char *)dest+1,sr=(char *)sr+1;
	return ret;
}

void *memmove(void *dest, const void *src, size_t n)
{
	void *sr=(char *)src+n-1,*ret=dest;
	dest=(char *)dest+n-1;
	while(n--) *(char *)dest=*(char *)src,dest=(char *)dest+1,sr=(char *)sr+1;
	return ret;
}

void *memset(void *str, int c, size_t n)
{
	void *ret=str;
	while(n--) *(char *)str=c,str=(char *)str+1;
	return ret;
}

char *strcat(char *dest, const char *src)
{
//	return strcpy(dest+strlen(dest),src);
	char *ret=dest,*sr=src;
	while(*dest!='\0') dest++;
	while(*sr!='\0') *dest=*sr,dest++,sr++;
	return ret;
}

char *strncat(char *dest, const char *src, size_t n)
{
	char *ret=dest,*sr=src;
	while(*dest!='\0') dest++;
	while(*sr!='\0'&&n--) *dest=*sr,dest++,sr++;
	return ret;
}

char *strchr(const char *str, int c)
{
//	return memchr(str,c,strlen(str));
	char *ret=str;
	while(*ret!='\0'&& *ret != c) ret++;
	if(*ret == c) return ret;
	else NULL;
}

int strcmp(const char *str1, const char *str2)
{
//	return memcmp(str1,str2,strlen(str1));
	char *st1=str1,*st2=str2;
	while(*st1==*st2) st1++,st2++;
	if(*st1==*st2) return 0;
	else return *st1-*st2;
}

int strncmp(const char *str1, const char *str2, size_t n)
{
//	return memcmp(str1,str2,n);
	char *st1=str1,*st2=str2;
	while(n&&*st1==*st2) st1++,st2++,n--;
	if(*st1==*st2) return 0;
	else return *st1-*st2;
}

char *strcpy(char *dest, const char *src)
{
//	return memcpy(dest,src,strlen(src)); 
	char *ret=dest,*str1=dest,*str2=src;
	while(*str1!='\0') str1++;
	while(*str2!='\0') *str1=*str2,str1++,str2++;
	return ret;
}

char *strncpy(char *dest, const char *src, size_t n)
{
//	return memcpy(dest,src,n);
	char *sr=src,*ret=dest;
	while(n--) *dest=*sr,dest++,sr++;
	return ret;
}

size_t strcspn(const char *str1, const char *str2)
{
	char *st1=str1,*st2;
	int count=0;
	while(*st1!='\0')
	{
		st2=str2;
		while(*st2!='\0')
		{
			if(*st2==*st1) break;
			st2++; 
		}
		if(*st2==*st1) break;
		count++,st1++;
	}
	return count;
}

char *strpbrk(const char *str1, const char *str2)
{
	char *st1=str1,*st2;
	while(*st1!='\0')
	{
		st2=str2;
		while(*st2!='\0')
		{
			if(*st2==*st1) break;
			st2++; 
		}
		if(*st2==*st1) break;
		st1++;
	}
	if(*st2==*st1) return st1;
	else return NULL;
}

char *strrchr(const char *str, int c)
{
	char *ret=str;
	while(*ret!='\0') ret++;
	while(ret!=str&& *ret != c) ret--;
	if(*ret == c) return ret;
	else NULL;
}

size_t strspn(const char *str1, const char *str2)
{
	char *st1=str1,*st2;
	int count=0;
	while(*st1!='\0')
	{
		st2=str2;
		while(*st2!='\0')
		{
			if(*st2!=*st1) break;
			st2++; 
		}
		if(*st2!=*st1) break;
		count++,st1++;
	}
	return count;
}

char *strstr(const char *haystack, const char *needle)
{
	char *s1,*s2,*p=haystack;
	while(*p!='\0')
	{
		s1=p,s2=needle;
		while(*s1!='\0'&&*s2!='\0'&& *s1==*s2) s1++,s2++;
		if(*s2=='\0') return p;
		p++;
	}
	return NULL;
}

char *strtok(char *str, const char *delim)
{
	char *st=strstr(str,delim),*del=delim;
	if(st==NULL) return NULL;
	while(*del!='\0') *st='\0',del++;
	return str;
}


#ifdef __cplusplus
}
#endif

#endif

标签:char,gt,const,dest,str1,ret,手打,lt,st2
From: https://www.cnblogs.com/AC-13-13/p/18447760

相关文章

  • [lnsyoj2378/luoguAT_arc107_d]Number of Multisets
    题意给出两个正整数\(N,K\),求有多少有理数集满足以下所有条件集合有且只有\(N\)个元素,并且元素和为\(K\);每个元素须可表示为\( \frac{1}{2^{i}}\) $(i\inN)$.sol考虑dp,容易想到记\(f_{i,j}\)表示选\(i\)个数恰好和为\(j\)考虑到会出现诸如\(\dfrac{1}......
  • 【GT240X】【04】你必须知道的 50 多个 Linux 命令
    文章目录一、介绍二、五十个linux命令一览表三、50个命令详解四、结论你必须知道的50多个Linux命令一、介绍你经常使用Linux命令?今天,我们将介绍50多个你必须知道的Linux命令。下面列出的命令是一些最有用和最常用的Linux命令,以及使用案例。先决条件......
  • pbootcms去除ueditor编辑器图片自动添加的title和alt属性
    为了去掉PbootCMS后台使用百度UEditor编辑器上传图片时自动添加的 title 和 alt 属性,并将其替换为默认为空的 alt 属性,可以按照以下步骤进行操作:步骤1:修改 ueditor.all.min.js 文件打开文件:打开文件 \core\extend\ueditor\ueditor.all.min.js。搜索并修改代码......
  • <动态规划>Leetcode96.不同的二叉搜索树
    给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。解题步骤如下:二叉搜素树的相关概念寻找规律思路建立代码实现1.二叉搜索树的相关概念①:若左子树不空,则左子树所有节点的值均小于它的根节点的值。......
  • <min/max,+>卷积与背包优化
    【前置知识】convex与concave:这是对于数组的概念。类比函数,下凸就是convex,上凸就是concave。【<min,+>卷积问题】考虑两个数组\(a_{1\simn},b_{1\simm}\),定义它们的<min,+>卷积结果\(c\):\(|c|=n+m\)。\(c_i=\min_{j+k=i}\{a_j+b_k\}\)。因为普通的卷积是\(\s......
  • Windows11系统mgtdyn.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个mgtdyn.dll文件(挑选合适的版本文件)把它放......
  • Set<String>和JTextField
    importjavax.swing.;importjava.awt.;importjava.util.HashSet;importjava.util.Set;importjava.util.Timer;importjava.util.TimerTask;publicclassSizeyunsuan{publicstaticvoidmain(String[]args){inti=1;SetgeneratedQuestions=newHashSet&......
  • Windows 11 24H2及LTSC版本发布:大量实用功能改进
    10月2日消息,微软已正式发布了 Windows11 2024更新(24H2),版本号26100.1742,该更新包含了许多小而实用的新增功能,改进了开始菜单、文件资源管理器、设置等。24H2版本引入了AI功能(Copilot+PC独有),包括实时字幕、画图中的Cocreator功能、WindowsStudio特效、自动超分以及图像生成和......
  • 题解:SP7973 ACPC10E - Sometimes, a penalty is good!
    比较简单的一道数学题。思路:计算小组赛的比赛总数。longlongstage1=G*T*(T-1)/2;每组有\(T\)个队伍,每个队伍都需要与其他\(T-1\)个队伍比赛,共有\(T\cdot(T-1)\)场比赛。共有\(G\)组,因此小组赛总比赛数为\(\frac{G\cdotT\cdot(T-1)}{2}\)。计算进入......
  • 59_初识搜索引擎_搜索相关参数梳理以及bouncing results问题解决方案
    1、preference决定了哪些shard会被用来执行搜索操作_primary,_primary_first,_local,_only_node:xyz,_prefer_node:xyz,_shards:2,3bouncingresults问题,两个document排序,field值相同;不同的shard上,可能排序不同;每次请求轮询打到不同的replicashard上;每次页面上看到的搜索......