C常用的字符串函数实现
/**
查找字符串 source 中 是否有指定的子串出现,如果有返回第一个匹配的字符
@param source 源
@param chars 目标
@return 返回值
*/
char *find_char0(char const *source, char const *chars) {
if (source == NULL || chars == NULL) {
return NULL;
}
char const *sc1, *sc2;
for (sc1 = source; *sc1 != '\0'; ++sc1) {
for (sc2 = chars; *sc2 != '\0'; ++sc2) {
if (*sc1 == *sc2) {
return (char *)sc1;
}
}
}
return NULL;
}
/**
字符串copy 实现
@param dest 目的字符串指针
@param src 源字符串指针
@return 返回值
*/
char *strcpy_(char *dest, const char *src){
char *ret = dest;
assert(dest != NULL);
while ((*dest++ = *src++)) {
;
}
return ret;
}
/**
字符串拼接
@param dest 目标字符串指针
@param src 源字符串指针
@return 目标字符串作为返回值
*/
char *strcat_(char *dest, const char *src) {
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
//找到dest指向字符串的末尾 '\0'
while (*dest != '\0') {//注意此处while 不能写成(*dest++ != '\0'),因为一个循环结束前又++操作会跳过 '\0'
dest++;
}
//拷贝src指向的内容
while ((*dest ++ = *src++)) {
;
}
return ret;
}
/**
查找一个字符中是否包含某一子串
@param str 给定的长字符串
@param substr 子串
@return 是否包含子串 不包含返回NULL 包含非NULL
*/
char *strstr_(const char *str, const char *substr){
assert(str != NULL);
assert(substr != NULL);
if (*substr == '\0') {
return str;
}
while (*str) {
const char *s1 = str;
const char *s2 = substr;
while (*s1 && *s2 && *s1 == *s2) {
s1++;
s2++;
}
if (*s2 == '\0') {//遍历到s2结尾
return str;//返回str 因为 str 记录了初始值的位置
}
str++;
}
return NULL;
}
/**
字符串比较
@param str1 字符串1
@param str2 字符串2
@return 比较结果 >0 = 0 <0
*/
int strcmp_(const char* str1, const char *str2){
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
//*str1 > *str2,返回值大于0 ,*str1 = *str2,返回值等于0 ,*str1 < *str2,返回值小于0
return *str1 - *str2;
}
/**
内存拷贝
@param dest 目标位置
@param src 源位置
@param count 长度 字节为单位
@return 目的位置地址
*/
char *memcpy_(void *dest, const void *src, size_t count) {
void *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (count) {
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
count--;
}
return ret;
}
/**
反向拷贝
@param dest 目的地址
@param src 源地址
@param count 长度 字节为单位
@return 过程函数,无返回值
*/
void *memmove_(void *dest, void *src, size_t count) {
void *ret = dest;
char *str1 = (char*)dest;
char *str2 = (char*)src;
assert(dest != NULL);
assert(src != NULL);
if (str1 > str2) {
while (count--) {
*(str1 + count) = *(str2 + count);
}
}else {
while (count--) {
*str1++ = *str2++;
}
}
return ret;
}
/**
反转字符串实现,不借助新的数组
@param s 字符串
@return 反转后的字符串
*/
void *strrev(char *s) {
//h指向s的头部
char *h = s;
char *t = s;
char ch;
//t指向s的尾部
while(*t++){};
t--;//与t++抵消
t--;//往回跳过结束符 '\0'
//当h 和 t未重合时,交换它们所指向的字符
while (h<t) {
ch = *h;
*h++ = *t;
*t-- = ch;
}
return s;
}
C常用的字符串函数实现的更多相关文章
- oc语言常用的字符串函数
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- MYSQL常用的字符串函数
#字符串函数 #返回字符串的字符数量,对于此例而言,结果为5SELECT CHAR_LENGTH('计算机编程'); #合并字符串,对于此例而言,结果为‘我喜欢计算机’SELECT CONCAT('我 ...
- php中比较复杂但又常用的字符串函数
php系统核心库自带的函数中,字符串比数组函数较为简单,但还是有一些较为复杂但又很常用的函数,比如下面的这些函数 explode()函数 用一个字符串来分割另一个字符串,返回结果是一个数组 explo ...
- php常用的字符串函数
addslashes -- 使用反斜线引用字符串 chr -- 返回相对应于 ascii 码值所指定的单个字符. chunk_split -- 将字符串分割成小块 count_chars -- 返回 ...
- mysql中常用的字符串函数
写在分割线之前,个人以为,数据库应该具备简单的的数据加工能力.如同食品在吃之前,是要经过很多到工序的,有经过初加工.粗加工.精加工.深加工等.那么mysql也应该并必须担任起数据初加工以及粗加工的责任 ...
- 常用的字符串函数-S
header('content-type:text/html;charset=utf-f'); /* $var=addslashes($_GET['username']);//转义表单提交内容中的引号 ...
- 【C】常用的字符串函数
1. strcpy 函数名:strcpy 用法:char *strcpy(char *destin, char *cource) 功能:将一个字符串从一个拷贝到另外一个 程序示例: #include ...
- 一些常用的字符串函数(CLR函数)
原代码来自:东莞--小小大神 使用 --聚合函数 SELECT father_key,dbo.String_Agg(department_name) FROM dbo.b_department GRO ...
- 常用C字符串函数
static void str_repalce(char *src,char *from,char *to) { char *p,*q; int lenFrom; int le ...
随机推荐
- 12C -- ORA-01017
本地使用使用sqlplus,尝试连接12.2数据库报错: 在另外一台服务器上,使用sqlplus连接该库,可以成功: 解决方案: 根据MOS文档id:207303.1看出,只有11.2.0.3之上的客 ...
- 使用dstat命令的插件查看mysql的io状态
使用dstat竟然还可以查看mysql的状态, man dstat之后发现的,原来在/usr/share/dstat目录下藏有很多python脚本作为插件帮助dstat搜集各类信息. 不过通常有可能会 ...
- 9.5 翻译系列:数据注解之ForeignKey特性【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code ...
- Ansible 使用普通用户远程执行playbook
设置ansible使用普通用户jsxge远程连接执行playbook 1. ansible控制端创建普通用户jsxgecd /homeuseradd jsxgechown -R jsxge.wheel ...
- runtime MethodSwizzle 实践之扩展 NIAttributedLabel
runtime MethodeSwizzle 提供 简单的方法交换已知类的 Method IMP. Method 可以是 外部可访问的 public 或者 private Method .所谓的属性 ...
- Atitit 数据库 标准库 sdk 函数库 编程语言 mysql oracle attilax总结
Atitit 数据库 标准库 sdk 函数库 编程语言 mysql oracle attilax总结 1.1. 常见的编程语言以及数据库 sql内部函数库标准化库一般有以下api1 1.2. 各个 ...
- [svc]cfssl模拟https站点-探究浏览器如何校验证书
准备cfssl环境 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl wget https://pkg ...
- ECMAScript 6 入门之新的数据类型Symbol
1.Symbol,一个每次创建都不一样的值 Symbol undefined null Boolean String Number Object let c=Symbol("这是一个Symb ...
- AI金融知识自学偏量化方向-了解不同类型的机器学习2
有监督学习 vs 无监督学习 迭代和评估 偏差方差权衡 结合有监督学习和无监督学习(半监督学习)
- Java编程的逻辑 (81) - 并发同步协作工具
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...