手打C库头文件string.h

news/2024/12/22 0:50:46/文章来源:https://www.cnblogs.com/AC-13-13/p/18447760

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

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

只能直接贴上代码:

/*
未经测试,准确率无法保证(如有错误,欢迎指出) 
其中 strcoll(), strerror(), strxfrm() 无法实现 */ 
#if !defined My_cstring && !defined _INC_STRING
#define My_cstring
#define _INC_STRING#ifndef size_t 
#ifdef _WIN64typedef unsigned long long size_t;
#elsetypedef 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808433.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WMCTF 2024 wp

WEBPasswdStealer前言本来题目叫PasswdStealer的:)考点就是CVE-2024-21733在SpringBoot场景下的利用。漏洞基本原理参考 https://mp.weixin.qq.com/s?__biz=Mzg2MDY2ODc5MA==&mid=2247484002&idx=1&sn=7936818b93f2d9a656d8ed48843272c0不再赘述。SpringBoot场景…

Z-library数字图书馆镜像地址及客户端/app(持续更新)

Z-library数字图书馆介绍 Z-library,被誉为全球范围内最为庞大的数字图书馆之一,其藏书量之丰富令人叹为观止,总计囊括了超过9,826,996册电子书及84,837,646篇学术期刊文章。这座庞大的知识宝库覆盖了从经典文学巨著到前沿理工学科,从人文艺术瑰宝到专业学术论文的广泛领域…

T3 玄泡面求调

觉得模拟赛题解还是单独放出来比较好。 A.挤压 好像不难?二进制表示下的平方展开没推出来,不然就成简单题了。 首先我们需要知道对于一个数 \(x\),把它拆成 29 位的二进制形式后,用 \(s_i\) 表示二进制下第 \(i\) 位上的数,那么其实这个数就是 \((\overline{s_{29} s_{28}…

Nuxt.js 应用中的 app:mounted 钩子详解

title: Nuxt.js 应用中的 app:mounted 钩子详解 date: 2024/10/5 updated: 2024/10/5 author: cmdragon excerpt: app:mounted 钩子在 Vue 应用的生命周期中扮演着重要角色,提供了在组件被挂载后的执行时机。通过合理利用这个钩子,我们能够提高组件的交互性、用户体验以及…

有奖求调!!!

T3 求调,12:00 之前调成功悬一袋红烧牛肉面 #include<bits/stdc++.h> #define Type int #define qr(x) x=read() typedef long long ll; using namespace std;inline Type read(){char c=getchar(); Type x=0;while(!isdigit(c))c=getchar();while(isdigit(c))x=(x<…

c盘清理指南

1.清理缓存文件 快捷键Win+R输入%temp%2.磁盘清理直接win键+搜索磁盘清理3.休眠文件关闭关机时下次开机powercfg -h off 有需要休眠文件的时候再powercfg -h on 4.临时文件 设置→系统→存储→临时文件,删除! 5.把ubuntu从c移到d出现0x80073cf6错误代码 https://www.yundongf…

轻松找到并查看织梦CMS的数据库配置文件,从而获取数据库连接信息

使用FTP工具连接到服务器。 导航到 /var/www/html/include 目录。 打开 config.inc.php 文件。使用SSH连接到服务器。 切换到相应目录:bashcd /var/www/html/include使用文本编辑器打开文件:bashvi config.inc.php通过以上步骤,你可以轻松找到并查看织梦CMS的数据库配置文件…

使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters 本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBase、V…

【Shiro】3.Springboot实现缓存

最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache 实现缓存 集成 Redis 实现 Shiro 缓存(推荐使用)在此之前,我们已经简单学会EhCache 和Reids的使用。 EhCa…

织梦如何数据库备份,织梦cms网站数据怎么备份与还原

织梦CMS(DedeCMS)的数据库备份和还原是非常重要的操作,可以帮助你在出现问题时快速恢复数据。下面详细介绍如何进行织梦CMS的数据库备份和还原。 一、数据库备份 1. 使用 phpMyAdmin 备份数据库登录 phpMyAdmin登录到你的网站控制面板(如 cPanel)。 找到并打开 phpMyAdmin…

【软考】3 校验码

校验码 码距概念:任意进制的两个码值之间的最小二进制位数称为校验码的码距 例如:二进制1bit位,从0到1,则码距是1,二进制2bit位 从 00 到 11 一共4个码字,但码距还是为1 可以设置 性别男为 00 女为 11两个合法码字,则该两个合法码字的最小码距为2 (间隔 01 和 10 两个)…

IOU指标

IOU:全称 intersection over union 交并比,两个区域真实框和预测框之间的交集比他们之间的总面积-交集的 IOU指标:通常用于评估计算机视觉任务中的模型性能,特别是目标检测和图像分割。一个较高的IoU值意味着模型的定位和分割精度更好。